在从生产库在线阅读代码时,我发现了类似这样的东西
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/