2013-04-15 28 views
3

下面的代碼無法在gcc 4.6.3中編譯,而它在鏗鏘3.1中編譯完美(我提供了DummyMath類的兩個版本,兩者都表現出相同的問題):在lambda表達式中使用模板類方法時出現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 

兩個版本類DummyMath的(V1和V2)無法在海灣合作委員會,並在鏗鏘都取得成功。這是GCC中的錯誤嗎?

謝謝。

+1

如果您將其重寫爲'return DummyMath :: sum(a1,a1);'它工作嗎? – Patashu

+0

事實上,它的工作原理是先生。 – Monfico

+2

gcc4.7.2在這裏有一個內部編譯器錯誤,這肯定是一個錯誤。所以在4.6.3中也可能有一個bug。 –

回答

4

這是來自gcc 4.7.2的已知錯誤(請參閱此question)。編譯器意識到這個指針將被捕獲,並且生成的閉包確實包含一個指針,但是該指針並沒有在閉包的構造函數中被初始化。

您可以使用return this->sum(a1, a2);來使其正常工作。在LiveWorkSpace上運行您的示例顯示,對於gcc> = 4.7.3以及Clang 3.2和Intel 13.0.1(即將8作爲輸出),這是固定的。

C++ 11支持非常流行,最好儘快升級到最喜歡的編譯器的最新版本。不幸的是,大多數Linux發行版都包含gcc 4.7.2的打包版本,而不是gcc 4.8.0。您可能需要從源代碼中編譯這些文件。

+1

gcc 5.4也有這個bug。你的建議修復解決了它。謝謝! –

相關問題