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提交之前,我想聽聽你的這種行爲。
良好的漁獲物。它可能是相關的,但它令我感到困惑,它只有在一元減去它之前才表現出來。這是某種解析錯誤或AST生成錯誤。我可能會打開一個新的bug並鏈接65719. – Escualo
我提交了錯誤(編號70056),GCC維護者確實將它標記爲65719的完全重複。所以,你明白了! – Escualo
我不能說看着變化的差異使我完全清楚 - 我認爲宣言和參考文獻是如何處理外部對內部聯繫的。 –