Передача лямбда-функции в функцию шаблона на VC10 - PullRequest
2 голосов
/ 10 сентября 2010

Я написал следующий код на VC10. Вызов f1 - это нормально, но при вызове f2 компилятор показал ошибку. Разница между двумя функциями заключается только в «шаблоне», но тип шаблона фактически не используется. Почему происходит ошибка?

#include <functional>

void f1( std::tr1::function<void()> f)
{
}

template <typename >
void f2( std::tr1::function<void()> f)
{
}

int main()
{
    f1( []{} );
    f2( []{} ); // Error C2783
}

Теперь я понимаю ошибку в первом коде. Как насчет следующего кода? Является ли причиной ошибки то, что компилятор не может определить тип шаблона, потому что lambda генерирует внутренний анонимный класс, но он отличается от std :: tr1 :: function?

#include <functional>

class MyClass
{
};

template <typename T>
void f2( std::tr1::function<void(T)> f)
{
}

int main()
{
    std::tr1::function<void(MyClass)> f= [](MyClass v){};

    f2( f );
    f2( [](MyClass v){} ); // C2784
}

1 Ответ

5 голосов
/ 10 сентября 2010

Это не относится к лямбдам вообще.Вы должны указать компилятору, какую версию шаблона вы хотите назвать:

f2<int>([]{});
f2<float>([]{});

Не имеет значения, используете вы их или нет.Это как неиспользуемые параметры функции:

void f(int) { }
int main() { f(); /* error! */ }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...