我在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
}
Run Code Online (Sandbox Code Playgroud)
现在我理解了第一个代码的错误.以下代码怎么样?是编译器无法决定模板类型的错误原因,因为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
}
Run Code Online (Sandbox Code Playgroud)