У меня проблемы с выяснением, где разместить перегруженные операторы, которые я создал. они должны быть в классе, в котором они работают, или внутри? оба способа доставляют мне неприятности. любые указатели были бы хороши.
вот мой самый базовый класс 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
. Кроме того, оператор = не будет работать для постоянного ввода, по-видимому, так как значения будут ULLL, который не существует, если кто-то не знает способ сделать это.
что мне делать?