我无法弄清楚在哪里放置我创建的重载运算符。他们应该在他们操作的类(class)里,还是在里面?这两种方式都给我带来了麻烦。任何指针都会很棒。
这是我最基本的 uint128_t 类:
class uint128_t{
private:
uint64_t UPPER, LOWER;
public:
// constructors
uint128_t(){
UPPER = 0;
LOWER = 0;
}
template <typename T>
uint128_t(T val){
UPPER = 0;
LOWER = (uint64_t) val;
}
template <typename S, typename T>
uint128_t(const S & upper_val, const T & lower_val){
UPPER = (uint64_t) upper_val;
LOWER = (uint64_t) lower_val;
}
uint128_t(uint128_t val){
UPPER = val.upper();
LOWER = val.lower();
}
uint64_t upper(){
return UPPER;
}
uint64_t lower(){
return LOWER;
}
};
如果运算符(operator)在类里面,他们工作正常。但是,我可以执行 uint128_t ^ uint32_t
但不能执行 uint32_t ^ uint128_t
。另一方面,将所有内容移到外面会给我 error: 'uint128_t operator=(uint128_t, T)' must be a nonstatic member function
。此外,operator= 显然不适用于常量输入,因为值将是 ULLL,它不存在,除非有人知道这样做的方法。
我该怎么办?
最佳答案
为什么不把两者结合起来呢? 将 operator= 放在里面,其余的放在外面。
对于将 uint128_t 作为左侧参数的那些,没关系,如果它是右侧参数,那么它必须是全局函数。因此,出于这个原因,如果它们是全局的,您可以将这两个函数并排放置。如果仅针对可交换的宏,您甚至可以使用一个聪明的宏来实现两者的一个实现。
关于c++ - 运算符重载 C++ 放置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6119306/