Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 命名空间中类外部的运算符重载_C++ - Fatal编程技术网

C++ 命名空间中类外部的运算符重载

C++ 命名空间中类外部的运算符重载,c++,C++,我试图在命名空间中重载union类的比较运算符,以将其用作无序映射中的键 x、 h: 我得到一份工作 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{ na

我试图在命名空间中重载union类的比较运算符,以将其用作无序映射中的键

x、 h:

我得到一份工作

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
函数,因为您很可能违反一个定义规则

[一条定义规则]

每个非内联函数或变量只有一个定义 即odr使用(见下文)需要出现在整个 程序(包括任何标准和用户定义的库)。这个 编译器不需要诊断此冲突,但需要诊断行为 违反它的程序的名称未定义

对于内联函数, 每个翻译单元都需要一个定义 使用odr

基本上存在如何违反ODR的bug类别

  • 在单个编译单元中有多个定义。这就是为什么我们在头文件中使用include-guard
  • 在编译单元级别没有冲突,但包含链接在一起的定义的多个编译单元。(本案)
  • 修正是微不足道的:

    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;
            }
        }
    }
    

    添加内联是可行的,但我不完全理解为什么。这是我唯一定义此函数的地方,为什么它违反了“一个定义”规则?@rm您确定您没有将文件包含到不同的编译单元并稍后将它们链接在一起吗?没错,这就是发生冲突的地方。谢谢
    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;
            }
        }
    }
    
    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;
            }
        }
    }