Wak*_*sei 2 lambda templates visual-studio-2010 c++11
我在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)
这根本不是lambda所特有的.您需要告诉编译器您要调用的模板版本:
f2<int>([]{});
f2<float>([]{});
Run Code Online (Sandbox Code Playgroud)
无论您是否使用它们都无关紧要.这就像未使用的函数参数:
void f(int) { }
int main() { f(); /* error! */ }
Run Code Online (Sandbox Code Playgroud)