变量模板无法 link
Variable template fails to link
以下代码:
template<typename T>
constexpr T foo { 1.2345 };
template<typename T>
T fun(T x) {
return -foo<T> * x;
}
int main() {
fun(2.0);
}
在 Linux
上使用 gcc 5.1.0 版编译
g++ gcc-bug.cpp -std=c++14
链接步骤失败并显示以下消息:
/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
删除一元减号(这改变了代码的含义),消除了链接错误。前置零(不会改变代码的含义)也可以消除错误。 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 中的错误提交之前,我想听听您对这种行为的看法。
runs fine using ... gcc 5.2.0
以下代码:
template<typename T>
constexpr T foo { 1.2345 };
template<typename T>
T fun(T x) {
return -foo<T> * x;
}
int main() {
fun(2.0);
}
在 Linux
上使用 gcc 5.1.0 版编译g++ gcc-bug.cpp -std=c++14
链接步骤失败并显示以下消息:
/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
删除一元减号(这改变了代码的含义),消除了链接错误。前置零(不会改变代码的含义)也可以消除错误。 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 中的错误提交之前,我想听听您对这种行为的看法。
runs fine using ... gcc 5.2.0