2016-03-02 49 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

我不能说看着变化的差异使我完全清楚 - 我认为宣言和参考文献是如何处理外部对内部联系的。 –