在Wandevoorde&Jossutis的书中有两个参数的非友元运算符+
Non-friend operator+ with two parameters in Wandevoorde&Jossutis' book
学习表达式模板。
在Wandevode和Jossutis的《模板》一书中,完整指南第18.2.3节运算符中,他们定义了一个带有两个参数的operator+
,但不是friend
方法。
template <typename T, typename R1, typename R2>
Array<T,A_Add<T,R1,R2> >
operator+ (Array<T,R1> const& a, Array<T,R2> const& b) {
return Array<T,A_Add<T,R1,R2> >
(A_Add<T,R1,R2>(a.rep(),b.rep()));
}
我是一个初学者,因此对我所了解的C++缺乏安全感。
这个operator+
不应该是friend
吗?
我试过
class A{
public:
explicit A(int x) : a(x){};
A& operator+(const A& x, const A& y){
A temp{x.a + y.a};
return temp;
};
private:
int a;
};
我得到一个二进制'operator+'参数太多。
您的"二进制"operator +
成员函数会出现"参数太多"错误,因为它有三个参数:您指定的x
和y
,以及隐式this
参数。这意味着它实际上需要三个论点,当然这是不可能的。
你可以让一个成员函数采用一个显式参数和隐式this
,但在许多人看来,这些二进制运算符(如加法和减法)最好在类之外实现,在与类相同的命名空间中实现,作为采用两个显式参数的自由函数。如果可以公开访问完成操作所需的数据(否则必须使用friend
,如果确实需要,也可以),那么这种方法尤其有效。
为下一位读者总结。
重载二进制算术运算符似乎有三种形式。
第一个:通过const
引用获取一个参数的成员方法。使用const
到返回值(根据此参考)来避免(x+y)=z
。
class A{
const A operator+(const A& other){
// ...
};
};
第二:一个友元方法,因此包含在类的定义中,取两个参数。
class A{
friend A& operator+(const A& operand1, const A& operand2){
// ...
};
};
第三:采用两个参数的非成员方法。
class A{
// ...
};
A operator+(const A& operand1, const A& operand2){
// ...
};
相关文章:
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- 如何允许模板参数中的类类型,仅当它有两个基类时
- C++如果两个模板函数都与参数列表匹配,将调用哪个模板
- 如何从两个不同的函数传递参数
- 两个函数模板候选项.将一个参数作为引用后,选择不太专业的模板
- 命令行参数,cant 或两个变量
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 如何创建两个具有相同名称和不同返回类型并基于布尔参数运行的函数
- 具有两个或多个模板参数的 C++ assigment 运算符
- 检查两个模板参数是否相同
- sscanf() 有两个字符串参数
- 如何在两个树通用的函数中创建一个参数?
- 为什么C++不允许两个同名的函数/类模板,区别仅在于非类型模板参数(整型)的类型?
- 为什么模板参数推导不适用于仅指定前两个参数的可变参数模板类?
- 用相同的参数声明两个构造函数的最偶像化的方法是什么?
- C++如何在 switch 语句中放置两个参数
- 为什么我不能用两个参数重载 C++ 运算符 []?
- 专门处理一个参数(C++模板)的两个模板参数
- C++stoi:这两个重载都无法转换所有参数类型
- 如何实现对参数顺序不可知的std::same_as的广义形式(即对于两个以上的类型参数)