模板化 class 前向函数声明、运算符 > 重载中正确的是什么
What's the correct in templated class forward function declaration, operator> overloading
我正在尝试重载 class 中的运算符,但不知道 class 前向声明函数中的正确语法,例如运算符。
template <typename S, typename T, typename R>
class TRIPLE
{
public:
TRIPLE(S, T, R);
const TRIPLE &operator=(const TRIPLE &other); // ok
TRIPLE friend bool &operator> (const TRIPLE &t1, const TRIPLE &t2); // not ok
S getFirst();
T getSecond();
void setFirst(S);
void setSecond(T);
private:
S *first;
T *second;
R *third;
};
template <typename S, typename T, typename R>
TRIPLE<S, T, R>::TRIPLE(S x, T y, R z) : first(x), second(y), third(z) {};
template <typename S, typename T, typename R>
const TRIPLE<S, T, R> &TRIPLE<S, T, R>::operator=(const TRIPLE<S, T, R> &other){
// all good.
}
template <typename S, typename T, typename R>
const TRIPLE<S, T, R> &TRIPLE<S, T, R>::operator>(TRIPLE<S, T, R> &lhs, TRIPLE<S, T, R> &rhs){
// error: overloaded 'operator>' must be a binary operator (has 3 parameters)
}
我尝试了各种方法:
TRIPLE friend bool &operator> (const TRIPLE &t1, const TRIPLE &t2);
const TRIPLE bool &operator> (const TRIPLE &t1, const TRIPLE &t2);
const TRIPLE friend bool &operator> (const TRIPLE &t1, const TRIPLE &t2);
编辑:
bool operator>(const TRIPLE &right) const;
没有错误,但是...
template <typename S, typename T, typename R>
bool operator>(TRIPLE<S, T, R> &rhs){
return rhs; // just for test
}
错误:重载 'operator>' 必须是二元运算符(有 1 个参数)
你要区分会员和非会员运营商。
成员运算符 > 接受一个参数(操作数是 *this
和 right
):
bool TRIPLE::operator>(const TRIPLE& right) const;
非成员运算符 > 有两个参数(操作数是 left
和 right
):
bool operator>(const TRIPLE& left, const TRIPLE& right);
按照惯例,以相同方式使用两个操作数的二元运算符(例如 +、-、>、< ... - 与 +=、-= ... 不同)是非成员函数.
此外,您在没有意义的地方过度使用了 TRIPLE
。我相信您对赋值运算符的规范形式是 TRIPLE& operator=(const TRIPLE&)
这一事实感到困惑。开头的 TRIPLE&
并不是识别运算符的神奇方法,它实际上是它的 return 值(如果你不在它的位置包含 return *this;
,你的编译器也会抱怨非常和)
最后,您几乎肯定希望成为运营商 returning bool
,而不是 bool&
。后者,如果它不会导致未定义的行为(悬挂引用),则不是对运算符的直观使用,这会破坏运算符重载的目的。
我正在尝试重载 class 中的运算符,但不知道 class 前向声明函数中的正确语法,例如运算符。
template <typename S, typename T, typename R>
class TRIPLE
{
public:
TRIPLE(S, T, R);
const TRIPLE &operator=(const TRIPLE &other); // ok
TRIPLE friend bool &operator> (const TRIPLE &t1, const TRIPLE &t2); // not ok
S getFirst();
T getSecond();
void setFirst(S);
void setSecond(T);
private:
S *first;
T *second;
R *third;
};
template <typename S, typename T, typename R>
TRIPLE<S, T, R>::TRIPLE(S x, T y, R z) : first(x), second(y), third(z) {};
template <typename S, typename T, typename R>
const TRIPLE<S, T, R> &TRIPLE<S, T, R>::operator=(const TRIPLE<S, T, R> &other){
// all good.
}
template <typename S, typename T, typename R>
const TRIPLE<S, T, R> &TRIPLE<S, T, R>::operator>(TRIPLE<S, T, R> &lhs, TRIPLE<S, T, R> &rhs){
// error: overloaded 'operator>' must be a binary operator (has 3 parameters)
}
我尝试了各种方法:
TRIPLE friend bool &operator> (const TRIPLE &t1, const TRIPLE &t2);
const TRIPLE bool &operator> (const TRIPLE &t1, const TRIPLE &t2);
const TRIPLE friend bool &operator> (const TRIPLE &t1, const TRIPLE &t2);
编辑:
bool operator>(const TRIPLE &right) const;
没有错误,但是...
template <typename S, typename T, typename R>
bool operator>(TRIPLE<S, T, R> &rhs){
return rhs; // just for test
}
错误:重载 'operator>' 必须是二元运算符(有 1 个参数)
你要区分会员和非会员运营商。
成员运算符 > 接受一个参数(操作数是 *this
和 right
):
bool TRIPLE::operator>(const TRIPLE& right) const;
非成员运算符 > 有两个参数(操作数是 left
和 right
):
bool operator>(const TRIPLE& left, const TRIPLE& right);
按照惯例,以相同方式使用两个操作数的二元运算符(例如 +、-、>、< ... - 与 +=、-= ... 不同)是非成员函数.
此外,您在没有意义的地方过度使用了 TRIPLE
。我相信您对赋值运算符的规范形式是 TRIPLE& operator=(const TRIPLE&)
这一事实感到困惑。开头的 TRIPLE&
并不是识别运算符的神奇方法,它实际上是它的 return 值(如果你不在它的位置包含 return *this;
,你的编译器也会抱怨非常和)
最后,您几乎肯定希望成为运营商 returning bool
,而不是 bool&
。后者,如果它不会导致未定义的行为(悬挂引用),则不是对运算符的直观使用,这会破坏运算符重载的目的。