以下代码无法在gcc 4.6.3中编译,而它在clang 3.1中编译完美(我提供了两个版本的DummyMath,两者都表现出同样的问题):
#include <iostream>
using namespace std;
//* // To swap versions, comment the first slash.
// ===============================================
// V1
// ===============================================
template <typename T>
class DummyMath
{
public:
T sum(T a1, T a2);
T mult(T a1, int n);
};
template <typename T>
T DummyMath<T>::sum(T a1, T a2)
{
return a1 + a2;
}
template <typename T>
T DummyMath<T>::mult(T a1, int n)
{
auto x2 = [this](T a1) -> T
{
return sum(a1, a1); // <------- gcc will say that "sum" was not declared in this scope!
};
T result = 0;
n = n/2;
for(int i = 0; i < n; ++i)
result += x2(a1);
return result;
}
/*/
// ===============================================
// V2
// ===============================================
template <typename T>
class DummyMath
{
public:
T sum(T a1, T a2)
{
return a1 + a2;
}
T mult(T a1, int n)
{
auto x2 = [this](T a1) -> T {
return sum(a1, a1);
};
T result = 0;
n = n/2;
for(int i = 0; i < n; ++i)
result += x2(a1);
return result;
}
};
//*/
int main()
{
DummyMath<float> math;
cout << math.mult(2.f, 4) << endl;
return 0;
}
错误是:
main.cpp:25:20: error: ‘sum’ was not declared in this scope
DummyMath类的两个版本(V1和V2)在gcc中都失败,并且都在clang中成功。这是GCC中的一个错误吗?
感谢。
答案 0 :(得分:4)
这是gcc 4.7.2中的已知错误(请参阅此question)。编译器识别出要捕获的this指针,并且生成的闭包确实包含一个指针,但该指针不会在闭包的构造函数中初始化。
您可以使用return this->sum(a1, a2);
让它发挥作用。在LiveWorkSpace上运行示例,表明这对于gcc&gt; = 4.7.3以及Clang 3.2和Intel 13.0.1(即打印8作为输出)是固定的。
C ++ 11支持非常不受欢迎,最好尽快升级到您喜欢的编译器的最新版本。不幸的是,大多数Linux发行版都发布了gcc 4.7.2的打包版本,还没有用于gcc 4.8.0。您可能需要从源代码编译它们。