gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:41 25 4
gpt4 key购买 nike

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

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/

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