使用lambda作为成员的成员初始化列表时VC ++ 2013错误

时间:2016-05-10 12:54:09

标签: c++ c++11 visual-c++ visual-studio-2013

我很难理解这些编译错误的来源。

以下代码在gcc-4.9.3和clang-3.8上编译没有任何问题,但在VS 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;
}

我最终遇到以下错误:

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

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

1 个答案:

答案 0 :(得分:1)

看起来Visual Studio没有将关于模板类型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;
}