C++模板类operator>重载及类内前置函数声明的正确语法是什么?
C++模板类二元运算符重载正确语法
你遇到的报错本质是混淆了成员函数重载和全局友元函数重载二元运算符的语法规则,两种写法的正确实现如下:
方案1:成员函数重载operator>
类内声明(你之前的写法是正确的)
template <typename S, typename T, typename R> class TRIPLE { public: // 其他成员函数省略 bool operator>(const TRIPLE &right) const; // 成员函数二元运算符只需要1个参数,左操作数为当前this对象 private: S *first; T *second; R *third; };
类外实现(你之前的错误是未加类作用域,导致编译器识别为全局函数)
template <typename S, typename T, typename R> bool TRIPLE<S,T,R>::operator>(const TRIPLE<S,T,R> &right) const { // 示例比较逻辑,可根据需求修改 return *first > *right.first; }
方案2:全局友元函数重载operator>
类内友元声明(你之前的错误是返回值、friend关键字顺序混乱)
template <typename S, typename T, typename R> class TRIPLE { public: // 其他成员函数省略 friend bool operator>(const TRIPLE &t1, const TRIPLE &t2); // friend放在最前,返回值为bool private: S *first; T *second; R *third; };
类外实现(全局函数不需要加类作用域,需要2个参数)
template <typename S, typename T, typename R> bool operator>(const TRIPLE<S,T,R> &t1, const TRIPLE<S,T,R> &t2) { // 友元可直接访问类私有成员 return *t1.first > *t2.first; }
额外注意点
你的构造函数存在隐含错误:类成员first/second/third是指针类型,初始化列表直接赋值first(x)会把值直接当指针地址,属于野指针,正确写法应为first(new S(x)), second(new T(y)), third(new R(z)),同时需要配套实现析构函数释放内存避免泄漏。
内容的提问来源于stack exchange,提问作者NaturalDemon
相关产品推荐
相关产品推荐

