我有以下简化方案:
template< typename T>
struct A
{
A() : action_( [&]( const T& t) { })
{}
private:
boost::function< void( const T& )> action_;
};
使用Visual C ++ 2010进行编译时,在构造action _时会出现语法错误:
1>test.cpp(16): error C2059: syntax error : ')'
1> test.cpp(23) : see reference to class template instantiation A<T>' being compiled
奇怪的是,同样的例子,没有模板参数,编译得很好:
struct A
{
A() : action_( [&]( const int& t) { })
{}
private:
boost::function< void( const int& )> action_;
};
我知道问题的一个解决方法是在构造函数体中移动action_初始化,而不是初始化列表,如下面的代码所示:
template< typename T>
struct A
{
A()
{
action_ = [&]( const T& t) { };
}
private:
boost::function< void( const T& )> action_;
};
...但我想避免这种解决方法。
有人遇到过这样的情况吗?是否有任何解释/解决这种所谓的语法错误?
答案 0 :(得分:1)
在Visual C ++ 2010中破坏Lambda的实现?这是我对解释的最佳猜测。
尽管如此,我很感兴趣的是通过引用捕获范围变量在这种情况下做什么......没什么?