【发布时间】:2020-06-01 19:35:28
【问题描述】:
我目前正在尝试创建一个专门用于多种类型的模板的编译时常量变量。目前,我正在使用常量表达式,例如以下通用示例:
template<typename T>
constexpr T GENERAL_CONSTANT = T(0.01);
template<> constexpr float GENERAL_CONSTANT<float> = float(0.02);
template<> constexpr double GENERAL_CONSTANT<double> = double(0.03);
然而,此代码似乎只适用于某些编译器/链接器。它将为 Windows 10 的 Clang 9.0.0、Windows 10 的 Clang 6.0.0、Ubuntu 18.04 的 Clang 6.0.0 和 Ubuntu 18.04 的 GCC 正确编译和工作。但是在其他几个配置中给出了类似的多重重新定义错误,例如 Windows 10 上的 Clang 10.0.0 或 Unix 上的 Clang 10.0.0,以及其他一些配置。这些错误通常看起来类似于:
/usr/bin/ld: <some path to a.cpp> multiple definition of `GENERAL_CONSTANT<double>'; <some path to a.cpp>: first defined here
/usr/bin/ld: <some path to a.cpp> multiple definition of `GENERAL_CONSTANT<float>'; <some path to a.cpp>: first defined here
其中 'a.cpp' 是使用常量但未定义它们的文件。因此,鉴于此错误根据编译器和机器而不一致地发生,我很好奇这是否是解决此问题的非标准方法,如果是这样,我应该采取什么方法?
【问题讨论】:
-
你可以把它包装成一个结构体。
-
还有,应该是
template<> constexpr float GENERAL_CONSTANT<float> = float(0.02); -
@PiotrSkotnicki 你是对的,我忘了在上面添加模板参数,但在我的代码中已经有了。至于更多细节,变量模板定义在头文件中,常量仅用于实现类/结构的源文件,这些类/结构也按类型模板化,即通常为浮点和双精度。
标签: c++ templates compile-time-constant