#include "stdafx.h"
#include <iostream>
using namespace std;
template<class Type>
struct X
{
void run()const
{//Why on earth this doesn't work?
[&]()
{
Type::alloc();
};
}
void run_1()const
{//if this does
Type::alloc();
}
};
struct T
{
static void alloc()
{}
};
int _tmain(int argc, _TCHAR* argv[])
{
X<T> x;
x.run_1();
return 0;
}
AFAIC lambda是一个未命名的fnc,所以如果这是真的,为什么run不能编译而run_1呢? 使用VS2010 sp beta1。
答案 0 :(得分:2)
你必须将它传递给lambda:
void run()const
{//Why on earth this doesn't work?
auto alloc = Type::alloc;
[&]()
{
alloc();
};
}
答案 1 :(得分:2)
我不得不承认我不太确定,但我认为这只是VS 2010的限制,它应该在C ++ 0x中编译得很好(参见templates, typename, lambda -> dependent names not dependent?)。我认为你所看到的机制如下:
在定义模板时,模板参数定义的类型在某些方面不是“完全成熟”的类型名称。证明这一点的一个例子是,虽然某人可能期望X<Foo>::Type
(使用您的示例中的X)返回Foo,但事实并非如此。
答案 2 :(得分:1)
你必须调用lambda。它是一个仿函数,所以你需要在它的末尾有一个()来有效地调用lambda。
/* Code does NOT answer question above...
void run()const
{//Why on earth this doesn't work?
[&]()
{
Type::alloc();
}(); //very important parenthesis if you wish to call the lambda
}*/
我似乎误解了这个问题。遗憾。
但是在SO Template type is not "seen" by the compiler inside a lambda
上已经有类似的帖子了这是另一个引用相同问题的链接,引用了关于此的标准。 templates, typename, lambda -> dependent names not dependent?