gpt4 book ai didi

c++ - 运算符在命名空间中的类之外重载

转载 作者:搜寻专家 更新时间:2023-10-31 02:15:51 24 4
gpt4 key购买 nike

我正在尝试重载命名空间中 union 类的比较运算符,以将其用作 unordered_map 中的键。

x.h:

#include <DirectXPackedVector.h>

namespace std
{
template<> struct hash<DirectX::PackedVector::XMUBYTEN4>
{
std::size_t operator()(DirectX::PackedVector::XMUBYTEN4 const& s) const {
std::size_t const h1(std::hash<uint8_t>()(s.x));
std::size_t const h2(std::hash<uint8_t>()(s.y));
std::size_t const h3(std::hash<uint8_t>()(s.z));
std::size_t const h4(std::hash<uint8_t>()(s.w));
return h1 ^ (h2 << 1) ^ (h3 << 2) ^ (h4 << 3);
}
};
}

std::unordered_map<DirectX::PackedVector::XMUBYTEN4, unsigned int> mc_province_index;

散列工作正常,但是当我尝试像这样重载比较运算符时:

bool operator==(const DirectX::PackedVector::XMUBYTEN4 & lhs, const DirectX::PackedVector::XMUBYTEN4 & rhs) {
if (lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z && lhs.w == rhs.w)
return true;
return false;
}

我得到一个

C2678: binary '==' : no operator found which takes a left-hand operand of type 'const DirectX::PackedVector::XMUBYTEN4' (or there is no acceptable conversion)

我尝试在命名空间内进行

namespace DirectX{
namespace PackedVector{
bool operator==(const DirectX::PackedVector::XMUBYTEN4 & lhs, const DirectX::PackedVector::XMUBYTEN4 & rhs) {
if (lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z && lhs.w == rhs.w)
return true;
return false;
}
}
}

但是这给了我一个 LNK2005 说它已经在目标文件中定义了。

我在这里做错了什么以及如何重载此运算符?

最佳答案

如果出现在头文件中,您应该将 operator==() 定义为 inline 函数,因为您很可能会违反一个定义规则。

http://en.cppreference.com/w/cpp/language/definition [一条定义规则]

One and only one definition of every non-inline function or variable that is odr-used (see below) is required to appear in the entire program (including any standard and user-defined libraries). The compiler is not required to diagnose this violation, but the behavior of the program that violates it is undefined.

For an inline function, a definition is required in every translation unit where it is odr-used.

基本上有如何违反 ODR 的错误类别。

  1. 单个编译单元中的多个定义。这就是我们在头文件中使用 include guards 的原因。
  2. 编译单元级别没有违规,但包含链接在一起的定义的多个编译单元。 (这种情况。)

修复很简单:

namespace DirectX{
namespace PackedVector{
inline bool operator==(const DirectX::PackedVector::XMUBYTEN4 & lhs, const DirectX::PackedVector::XMUBYTEN4 & rhs) {
if (lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z && lhs.w == rhs.w)
return true;
return false;
}
}
}

关于c++ - 运算符在命名空间中的类之外重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37977002/

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