gpt4 book ai didi

c++ - 模板特化的 ODR 违规

转载 作者:行者123 更新时间:2023-11-30 03:30:05 27 4
gpt4 key购买 nike

我们有一个头文件,其中包含各种浮点精度的一些残差:

template <typename T>
struct rsdTarget {
static const double value;
};

template <>
const double rsdTarget<half>::value = (double)(1.0e-3);

template <>
const double rsdTarget<float>::value = (double)(1.0e-7);

template <>
const double rsdTarget<double>::value = (double)(1.0e-12);

这是有效的,因为这个 header 只包含在一个编译单元中。现在,我尝试在多个编译单元中使用此 header ,但出现了源自 ODR 的链接器错误:

CMakeFiles/tests_g.dir/random_gauge.cc.o:(.rodata+0x108): multiple definition of `rsdTarget<double>::value'
CMakeFiles/tests_g.dir/clover_product.cc.o:(.rodata+0x548): first defined here

初始化可能需要进入源文件并从头文件中取出。但是,似乎禁止在 const double 前面添加一个 extern

我需要做什么才能让它适用于多个编译单元?

更新

我认为为 double 解决这个问题会完全解决它。但是,还有第二种非文字类型,我也必须执行:

template <typename T>
struct tolerance {
static const QDP::Double small; // Always fail
};

template <>
const QDP::Double tolerance<half>::small = QDP::Double(5.0e-3);

template <>
const QDP::Double tolerance<float>::small = QDP::Double(1.0e-6);

template <>
const QDP::Double tolerance<double>::small = QDP::Double(1.0e-7);

我似乎无法将它与 constexpr 一起使用,因为该类型不支持它(需要 constexpr ctor,对吧?)。哪些解决方案也适用于此?

最佳答案

您可以允许所有这些定义驻留在头文件中,而不会在多个翻译单元中使用时导致链接器错误,您只需要将它们也转换为模板:

template<typename T, typename TDummy = void>
struct rsdTarget;

template<typename TDummy>
struct rsdTarget<half, TDummy>
{
static const double value;
};

template<typename TDummy>
const double rsdTarget<half, TDummy>::value = (double)(1.0e-3);

template<typename TDummy>
struct rsdTarget<float, TDummy>
{
static const double value;
};

template<typename TDummy>
const double rsdTarget<float, TDummy>::value = (double)(1.0e-7);

template<typename TDummy>
struct rsdTarget<double, TDummy>
{
static const double value;
};

template<typename TDummy>
const double rsdTarget<double, TDummy>::value = (double)(1.0e-12);

关于c++ - 模板特化的 ODR 违规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45210631/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com