以下示例演示了我在VC ++ 2010中遇到的问题:
class Foo
{
template<class T>
static T foo(T t) { return t; }
public:
void test()
{
auto lambda = []() { return foo(1); }; // call to Foo::foo<int>
lambda();
}
};
VC ++产生:错误C3861:'foo'
:未找到标识符
如果我将调用限定为foo:Foo::foo(1);
,则此示例将编译并发出警告:
警告C4573:'Foo::foo'
的使用要求编译器捕获'this'
,但当前的默认捕获模式不允许
标准对此案有何评价?应该找到不合格的名字吗?合格的名称是否需要捕获this
?
答案 0 :(得分:4)
Microsoft已经在许多情况下报告了此问题。参见:
Scope Resolution with lambdas interferes with namespace and type resolution
Template resolution in lambdas
正如您所知,明确的解决方案允许它找到名称。还有一个警告,这也是一个编译器错误(名称解析不需要访问它,虽然我可以看到编译器实现可能需要它) - 但它是一个单独的错误。微软已经证实这是一个错误,并且显然为下一个版本准备了一个修复程序。
答案 1 :(得分:2)
以下编译正常。在我看来,这只是一个带模板的VS错误。
struct Foo {
static void foo() {}
void bar() {
auto f = []() { foo(); };
f();
}
};