Специализация шаблона - компилятор не может божественный тип аргументаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Специализация шаблона - компилятор не может божественный тип аргумента

Сообщение Anonymous »

Я пытаюсь специализировать шаблонную функцию с помощью функционального аргумента, но компилятор не может сделать вывод правильной специализации. Я получаю ошибки компилятора, если только я явно не в отношении типа функции.

Код: Выделить всё

#include 

int data;
using MyFunction = std::function;

template void set(const T& value)
{
data = value;
}

template void set(const MyFunction& f)
{
data = f();
}

int main()
{
set(1); // OK

MyFunction f2 = []() { return 1; }; // OK
set(f2);

auto f1 = []() { return 1; }; // COMPILE ERROR
set(f1);

set([]() { return 1; }); // COMPILE ERROR

return 0;
}
Ошибка компилятора (g ++/c ++ 11):
main.cpp: In instantiation of ‘void set(const T&) [with T = main()::]’:
main.cpp:26:8: required from here
main.cpp:10:10: error: invalid user-defined conversion from ‘const main()::’ to ‘int’ [-fpermissive]
10 | data = value;
| ~~~~~^~~~~~~
main.cpp:25:15: note: candidate is: ‘constexpr main()::::operator int (*)()() const’ (near match)
25 | auto f1 = []() { return 1; }; // COMPILE ERROR
< /code>
Пример код включает в себя вареная версия моих попыток. Пробовал C ++ 11, 14, 17, 20 с теми же результатами. MSVC 16 и G ++, аналогичные результаты.
Я надеюсь/ожидаю, что компилятор правильно выведет тип функции Lambda и выберите правильную специализацию.

Подробнее здесь: https://stackoverflow.com/questions/781 ... ument-type
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»