【问题标题】:Why does this template variable lead to a compiler warning?为什么这个模板变量会导致编译器警告?
【发布时间】:2014-06-28 07:38:14
【问题描述】:

为什么我会收到来自 Clang 的警告?对我来说,这似乎是对模板化常量的合理使用。

warning: variable 'M_PI<int>' has internal linkage but is not defined [-Wundefined-internal]

#include <iostream>

template <typename T>
constexpr T M_PI = T(3.1415926535897932);

template <typename T>
constexpr T CalcCircumference(T d)
{
    return d * M_PI<T>;
}

int main()
{
    std::cout << CalcCircumference(42.0f);
}

编辑:显然,一个简约的测试用例让一些人感到困惑。我稍微修饰了一下,希望能缓解这种情况。

【问题讨论】:

  • @hvd 此代码从 main 返回一个常量值,所以 course 毫无意义,但由于它看起来很简单,但它会生成一个警告,我想知道为什么。

标签: c++ templates clang compiler-warnings c++14


【解决方案1】:

我认为您应该忽略警告,并且现在应该完全避免使用变量模板。

考虑

template <typename T> T var = 0;
int main() { return var<int>; }

编译时没有警告、链接和运行返回零。

template <typename T> T var = 0;
template <typename T> T func() { return var<T>; }
int main() { return func<int>(); }

编译时没有警告,但不链接:它给出了错误消息。

$ clang++ test2.cc -o test2 -std=c++1y -pedantic -Wall /tmp/test2-736968.o:test2.cc:function int func(): error: undefined reference to 'var' clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

强制显式实例化确实有效:

template <typename T> T var = 0;
template int var<int>;
template <typename T> T func() { return var<T>; }
int main() { return func<int>(); }

我想说这表明clang中变量模板的实现是不完整的。您对constexpr 的使用只是让clang 检测到它自己的不完整实现。

【讨论】:

    【解决方案2】:

    这是 Clang 早期版本中的一个错误(归档为 PR19305)。另请参阅PR19571PR17846,它们是具有相似症状的不同错误。这些都在 Clang 3.5 中修复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-15
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 2017-11-03
      • 2013-04-03
      相关资源
      最近更新 更多