在 VC10 上将 lambda 传递给模板函数
我在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
}
I wrote the following code on VC10. Calling f1 is okay, but on calling f2 the compiler showed an error. The difference between the two functions is only "template ", but the template type is actually not used. Why does the error occur?
#include <functional>
void f1( std::tr1::function<void()> f)
{
}
template <typename >
void f2( std::tr1::function<void()> f)
{
}
int main()
{
f1( []{} );
f2( []{} ); // Error C2783
}
Now I understand the error on the first code. How about the following code? Is it the error reason that the compiler can't decide the template type because lambda generates an internal anonymous class, but it is different from 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
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这根本不是 lambda 特有的。您需要告诉编译器您要调用哪个版本的模板:
是否使用它们并不重要。就像未使用的函数参数:
This is not specific to lambdas at all. You need to tell the compiler what version of the template you want to call:
It doesn't matter whether you use them or not. It's like unused function parameters: