变量模板无法链接

时间:2016-03-02 21:00:29

标签: c++ linker variable-templates

以下代码:

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中的错误之前,我想听听您对此行为的看法。

1 个答案:

答案 0 :(得分:2)

  

使用... gcc 5.2.0

运行正常

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