首页 > 解决方案 > 在同一类型的多个运算符重载的情况下如何避免 C++ ODR 违规

问题描述

如果在不同的翻译单元但在相同的构建目标中多次实现相同类型的运算符,我会遇到 ODR 违规问题。

例子:

模块 Test.exe 正在与 Test1.cpp 和 Test2.cpp 一起编译。哪些是使用通用类型TYPE

struct TYPE
{
   FieldType1 Field1
   ...
   FieldTypeN FieldN
};

Test1.cpp 和 Test2.cpp为TYPE实现特定的operator==()以仅根据某些值比较TYPE 。例如,我只需要检查Id字段并且不想填写所有其他字段以保持测试简短明了。像operator<<()这样的其他运算符也是如此

两个测试文件都使用外部测试库(BOOST TEST、hippomock 等),它使用operator==()进行类型比较。当我尝试构建测试时,我有一个关于多重定义的错误(或者在 MSVC 的情况下只是随机链接函数)。

我试图将每个运算符放入单独的命名空间,然后键入

using namespace::operator==;

在 *.cpp 文件中,但它没有帮助。

有没有可能避免这个问题?

标签: c++operator-overloadingone-definition-rule

解决方案


推荐阅读