Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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++ 使用模板化运算符重载XOR运算符失败_C++ - Fatal编程技术网

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;