【发布时间】:2011-09-01 10:27:48
【问题描述】:
我无法弄清楚我创建的重载运算符的放置位置。他们应该在他们操作的班级还是里面?两种方式都给我带来了麻烦。任何指针都会很棒。
这是我非常基本的 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;
}
};
如果操作员在课堂上,他们工作正常。但是,我可以做到uint128_t ^ uint32_t,但不能做到uint32_t ^ uint128_t。另一方面,将所有东西移到外面给我error: 'uint128_t operator=(uint128_t, T)' must be a nonstatic member function。此外,operator= 显然不适用于常量输入,因为值将是 ULLL,它不存在,除非有人知道这样做的方法。
我该怎么办?
【问题讨论】:
-
这个编译?它不应该。您的复制构造函数是非法的。它按值传递参数,但这是不可能的,因为除非你已经有一个复制构造函数,否则你不能按值传递参数。它应该通过 const 引用接受它的参数。事实上,你甚至不应该定义它,因为在这种情况下默认的复制构造函数可以正常工作。