2016-05-10 15 views
2

我很难理解这些编译错误的来源。将lambda作为成员使用成员初始值设定项列表时出现VC++ 2013错误

下面的代码编译,而不在GCC-4.9.3和铛 - 3.8任何问题,但2013年

class Sample 
{ 
    public: 
     template<typename T> 
     explicit Sample(T& in) : 
     x(in), 
     lamb([](Sample& ss) 
     {               
      std::cout << "This works !!\n" << static_cast<const T&> (ss.get()) << std::endl; 
     }){} 

     const int get() const { return x; } 
    private: 
     int x; 
     std::function<void(Sample&)> lamb; 
}; 

int main() 
{ 
    int z = 10; 
    Sample a(z); 
    return 0; 
} 

我结束了以下错误的VS失败:

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
error C2061: syntax error : identifier 'T' 

的MSDN对这些错误的解释并没有多大帮助。我在这里做错了什么?

+2

[编译](http://melpon.org/wandbox/permlink/OAkFvu1qV9ESP7Pc)[无](http://melpon.org/wandbox/permlink/LUNHOZZie6GL93E9)任何问题](http://melpon.org/wandbox/permlink/THuTNjFlnhTnokAB)。 –

+0

哎呀... :) :)我用一个确实编译好gcc和clang的代码更新了这个问题。在VS 2013仍然错误。 – Recker

+0

http://webcompiler.cloudapp.net/使用VS,它显示了实际的错误消息,它使得它清楚,lambda不能使用构造函数的模板参数T(与静态转换的行)作为至于是否应该,我会和clang和gcc一起去,但这是个人意见,没有理由。 –

回答

1

看起来,视觉工作室并没有将有关模板类型T的信息传递给lambda。我已将类变量传递给lambda以收集所需的类型信息。像这样的工作:

#include <functional> 
#include <iostream> 

class Sample 
{ 
    public: 
     template<typename T> 
     explicit Sample(T& in) : 
     x(in), 
     lamb([this](Sample& ss) 
     {               
      std::cout << "This works !!\n" << static_cast<decltype(x)> (ss.get()) << std::endl; 
     }){} 

     const int get() const { return x; } 
    private: 
     int x; 
     std::function<void(Sample&)> lamb; 
}; 

int main() 
{ 
    int z = 10; 
    Sample a(z); 
    return 0; 
} 
+0

上帝保佑[decltype](http://en.cppreference.com/w/cpp/language/decltype).... – Recker

相关问题