C++ 使用模板化运算符重载XOR运算符失败
我想对两个值进行异或运算,一个是空指针,另一个是指向模板类C++ 使用模板化运算符重载XOR运算符失败,c++,C++,我想对两个值进行异或运算,一个是空指针,另一个是指向模板类节点的指针,因为我也会多次这样做,所以我不想为所有这些值写出reinterpret\u cast,所以我写了一个函数来为我做。该函数工作得很好,但由于某种原因,当我将其设置为运算符时,无论我如何调用它(我尝试了调用运算符的常规方法和函数样式,两者都会给出不同的错误),它都会抛出编译错误。以下是操作员和功能: template<typename T, typename U, typename = typename std::enabl
节点的指针,因为我也会多次这样做,所以我不想为所有这些值写出reinterpret\u cast
,所以我写了一个函数来为我做。该函数工作得很好,但由于某种原因,当我将其设置为运算符时,无论我如何调用它(我尝试了调用运算符的常规方法和函数样式,两者都会给出不同的错误),它都会抛出编译错误。以下是操作员和功能:
template<typename T, typename U, typename = typename std::enable_if<(std::is_pointer<T>::value || std::is_null_pointer<T>::value) && (std::is_pointer<U>::value || std::is_null_pointer<U>::value)>::type>
uintptr_t* operator^(T left, U right)
{
return reinterpret_cast<uintptr_t*>(reinterpret_cast<uintptr_t>(left) ^ reinterpret_cast<uintptr_t>(right));
}
template<typename T, typename U, typename = typename std::enable_if<(std::is_pointer<T>::value || std::is_null_pointer<T>::value) && (std::is_pointer<U>::value || std::is_null_pointer<U>::value)>::type>
uintptr_t* XorPtr(T left, U right)
{
return reinterpret_cast<uintptr_t*>(reinterpret_cast<uintptr_t>(left) ^ reinterpret_cast<uintptr_t>(right));
}
其中prev->both是指向模板类的指针。您没有定义运算符重载,因为您没有满足定义:
运算符函数应为非静态成员函数,或至少具有一个类型为类、类引用、枚举或枚举引用的参数的非成员函数
涉及这些类型以外的类型的操作始终遵循内置类型的语义;您无法更改(例如)将运算符应用于一对指针的效果,因为它已经有了意义(至少,如果运算符是-
),或者指针和整数,或者整数和浮点数。您没有定义运算符重载,因为您无法满足定义:
运算符函数应为非静态成员函数,或至少具有一个类型为类、类引用、枚举或枚举引用的参数的非成员函数
涉及这些类型以外的类型的操作始终遵循内置类型的语义;您不能更改(例如)将运算符应用于一对指针的效果,因为它已经有了意义(至少,如果运算符是-
),或者一个指针和一个整数,或整数和浮点数。请编辑您的问题,以包含如何调用^
运算符?您是否向一侧提供对象引用,向另一侧提供nullptr?因为您的模板似乎只接受指针。无论如何,nullptr
不是XOR的标识元素吗?当两个参数都是指针时,您不能重载运算符。其中一个参数必须是(对)对象的引用。如果您希望显式传递nullptr
,则最好将该参数声明为std::nullptr\u t
。请编辑您的问题,以包含如何调用^
运算符?您是否向一侧提供对象引用,向另一侧提供nullptr?因为您的模板似乎只接受指针。无论如何,nullptr
不是XOR的标识元素吗?当两个参数都是指针时,您不能重载运算符。其中一个参数必须是(对)对象的引用。如果您希望显式传递nullptr
,则最好将该参数声明为std::nullptr\u t
@KrystianS:您可能喜欢的是“命名运算符”。。。如果您有一个类类型的全局实例ptr
,那么您可以使nullptr^ptr^prev->both
工作。请看@krystian:您可能喜欢的是“命名运算符”。。。如果您有一个类类型的全局实例ptr
,那么您可以使nullptr^ptr^prev->both
工作。看见
operator^(nullptr, prev->both);
nullptr ^ prev->both;