Следующий код не скомпилирован в gcc 4.6.3, в то время как он компилируется безупречно в clang 3.1 (я предоставляю две версии класса DummyMath, обе имеют ту же проблему):Ошибка компиляции GCC при использовании метода класса шаблона внутри выражения лямбда
#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
Обе версии (V1 и V2) класс DummyMath неудачи в GCC, и оба успех в звоне. Это ошибка в GCC?
Спасибо.
Если вы переписываете его как нечто вроде 'return DummyMath :: sum (a1, a1);' это работает? –
Patashu
Действительно, это работает сэр. – Monfico
В gcc4.7.2 есть внутренняя ошибка компилятора, что, безусловно, является ошибкой. Так что, вероятно, ошибка в 4.6.3 тоже. –