2016-03-02 47 views
3

以下代碼:可變模板未能鏈接

/tmp/ccuciovi.o: In function `double fun<double>(double)': 
gcc-bug.cpp:(.text._Z3funIdET_S0_[_Z3funIdET_S0_]+0xd): undefined reference to `foo<double>' 
collect2: error: ld returned 1 exit status 

template<typename T> 
constexpr T foo { 1.2345 }; 

template<typename T> 
T fun(T x) { 
    return -foo<T> * x; 
} 

int main() { 
    fun(2.0); 
} 

使用gcc版本5.1.0在Linux

g++ gcc-bug.cpp -std=c++14 

時與後續消息中的連接步驟失敗編譯

刪除一元減號(它改變了代碼的含義),擺脫了鏈接錯誤。預先置零(不會改變代碼的含義)也可以消除錯誤。的foo導致以下兩種實現一個成功的編譯:

template<typename T> 
T fun(T x) { 
    return foo<T> * x; // different meaning 
} 

template<typename T> 
T fun(T x) { 
    return 0 - foo<T> * x; // same meaning 
} 

我不遵守在其他編譯器這種行爲。原始代碼(使用一元減號)使用clang 3.6.0和gcc 5.2.0編譯並運行正常。

在我作爲gcc 5.1.0中的一個bug提交之前,我想聽聽你的這種行爲。

回答

2

運行正常使用... GCC 5.2.0

可能https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65719

+0

良好的漁獲物。它可能是相關的,但它令我感到困惑,它只有在一元減去它之前才表現出來。這是某種解析錯誤或AST生成錯誤。我可能會打開一個新的bug並鏈接65719. – Escualo

+0

我提交了錯誤(編號70056),GCC維護者確實將它標記爲65719的完全重複。所以,你明白了! – Escualo

+0

我不能說看着變化的差異使我完全清楚 - 我認爲宣言和參考文獻是如何處理外部對內部聯繫的。 –