模板类成员方法中的自动lambda:不命名类型

时间:2013-10-15 21:33:57

标签: c++ templates lambda auto

为什么我无法编译以下代码(使用g ++ 4.7.1)?

#include <set>

template<typename T>
class Problem
{
    public:
        void f();

        std::set<int> dummyvalue;
};

template<typename T>
void Problem<T>::f()
{
    auto mytestlambda = [this](){
        dummyvalue.clear();
    };
}

int main()
{
    return 0;
}

我收到以下错误:

main.cpp: In member function 'void Problem<T>::f()':
main.cpp:17:10: error: 'mytestlambda' does not name a type

我在检查无法调用“clear()”方法的问题时遇到了这个问题。

添加'-std = c ++ 11'真的能让我解决我的真正问题:

main.cpp: In lambda function:
main.cpp:18:26: error: no matching function for call to 'std::set<int>::clear() const'
main.cpp:18:26: note: candidate is:
In file included from /usr/include/c++/4.7/set:61:0,
                 from main.cpp:1:
/usr/include/c++/4.7/bits/stl_set.h:580:7: note: void std::set<_Key, _Compare, _Alloc>::clear() [with _Key = int; _Compare = std::less<int>; _Alloc = std::allocator<int>] <near match>
/usr/include/c++/4.7/bits/stl_set.h:580:7: note:   no known conversion for implicit 'this' parameter from 'const std::set<int>*' to 'std::set<int>*'

为什么这里涉及'const'?

3 个答案:

答案 0 :(得分:2)

这是因为您没有在编译器中启用C ++ 11。尝试为GCC使用--std=c++11标志。然后它应该正确编译。

答案 1 :(得分:2)

这是GCC 4.7中的一个错误。升级到4.8修复了它。

显然,GCC 4.7错误地将this标记为const

答案 2 :(得分:0)

尝试使用-std=c++11进行编译。遗憾的是,目前的编译器仍默认为> 10年的标准。