c++ - 如何避免使用特征类违反 ODR

标签 c++ templates one-definition-rule

在从生产库在线阅读代码时,我发现了类似这样的东西

Traits.hpp

template <typename Type>
class Traits {
    template <typename T, 
              detail::EnableIfIsInstantiation<T, Type>* = nullptr>
    static void foo(T& object) { 
        object.foo();
    } 
};

SpecialTraits.hpp

template <>
class Traits<Special> {
    static void foo(Special& object) {
        object.foo();
    }
    static void foo(Special&& object) {
        object.special_foo();
    }
};

如果库在一个翻译单元中实例化一个使用Traits for Something 的类型而不包括 SpecialTraits.hpp,这将导致 ODR 冲突然后实例化一个使用另一个翻译单元中的特殊特征的类型。当这两个翻译单元链接在一起时,这会导致 ODR 违规。

避免此问题的建议方法是什么?我是否必须求助于在原始 Traits.hpp 文件中包含所有特化?如果不允许我使用 Special 的定义编辑文件怎么办?

注意 请忽略 foo() 可以在 && 中由 Special 本身专门化的事实案件。我想不出一个更好的例子..

最佳答案

将特化放在“WidgetWrapper.hpp”而不是“Widget.hpp”中,并在所有地方包含“WidgetWrapper.hpp”。否则,使用 Boost 提交错误报告并期望它无处可去,因为这个确切的 problem 15 年前讨论过,但没有解决。

关于c++ - 如何避免使用特征类违反 ODR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44477925/

相关文章:

c++ - 右值引用或转发引用?

C++ 模板函数。错误 C2440 : 'return' : cannot convert from '_FwdIt1' to '_FwdIt1'

c++ - 为什么非模板类要在头文件和源文件中分开?

c++ - ODR 的目的是什么?

c# - 数组内存分配——分页

c++ - 无法将 std::vector<bool> 传递给 winrt::array_view

C++ 模板不可理解的行为

c++ - 使用 enable_if 重载类模板的成员函数

c++ - 内联函数和一个定义规则

c++ - 如何在 boost 图中添加彩色边?