Я написал следующий код на 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
}