【发布时间】:2010-09-10 18:30:09
【问题描述】:
我在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
}
【问题讨论】:
标签: visual-studio-2010 templates lambda c++11