Я думаю, что синтаксис 0x все еще немного испорчен.
auto myFunc = [&] ( returnType (*functionPointerToAdd)(T1) ) -> returnType (*)(T1, T2, T3) { functionPointerToAdd(T1); };
Эта строка - проблема. Давайте разберемся с этим:
auto myFunc = [&]
Это создает локальную переменную неопределенного типа, которая получает лямбду (что нормально) и запускает лямбду, которая принимает указатель на функцию по ссылке. Указатель уйдет, лучше сделайте его [=] для простоты (вы скопируете полный указатель больше - не важно).
( returnType (*functionPointerToAdd)(T1) )
Это аргументы в пользу лямбды. Это означает, что лямбда должна вызываться (!) С указателем на функцию типа returnType (*) (T1). Это не то, что вы хотите - вы хотите, чтобы он вызывался с T1, T2, T3.
-> returnType (*)(T1, T2, T3)
Это определяет тип возврата лямбды - и только это. Теперь вы говорите, что он должен возвращать указатель на функцию, которая возвращает returnType и принимает в качестве аргумента T1, T2 и T3. Тогда лямбда-тип будет
(returnType(*)(T1, T2, T3)) (*)(returnType(*)(T1))
, или функция, которая принимает указатель функции в качестве аргумента и возвращает указатель функции. Да, он слишком сложный и нечитаемый.
{ functionPointerToAdd(T1); };
Это, наконец, содержание лямбды и причина вашей ошибки. Вы передаете тип T1 в качестве аргумента указателю на функцию.
Предложение по его исправлению (так как синтаксис ужасно сложен - надеюсь, приведенный выше текст поможет вам понять, почему я изменил:
auto myFunc = [=] ( T1 arg, T2, T3 ) -> returnType { return functionPointerToAdd(arg); }
Не стесняйтесь спрашивать, почему и как.