为什么类成员函数不能接受与其类相同类型的多个参数
Why can't a class member function take more than one argument of the same type as its class
前几天,当我试图使用类成员函数重载一个双参数操作符时,遇到了麻烦。我试过推荐信,但没有任何改变。编译器说我不能编写一个成员函数,它不能接受与类本身相同类型的多个参数。为什么呢?
代码如下:
class Fraction
{
public:
Fraction(int num=1, int den=1): numerator(num), denominator(den) {}
Fraction(const Fraction& r): numerator(r.numerator), denominator(r.denominator) {}
Fraction& operator=(const Fraction&);
Fraction& operator*(const Fraction&, const Fraction&);
private:
int numerator, denominator;
};
Fraction& Fraction::operator=(const Fraction& r)
{
numerator = r.numerator;
denominator = r.denominator;
return *this;
}
Fraction Fraction::operator*(const Fraction& x, const Fraction& y)
{
Fraction z(x.numerator*y.numerator, x.denominator*y.denominator);
return z;
}
下面是编译器给出的错误信息:
Fraction& Fraction::operator*(const Fraction&, const Fraction&)' must take either zero or one argument
操作符接受固定数量的实参,例如operator+作为加法操作符,正好接受2个形参。如果它是一个成员函数,第一个(最左边的)被暗示为this,第二个作为参数传递。
调用带有三个形参的操作符+会是什么样子?有人可能会想象它看起来像3 + 4 + 5,但这相当于调用operator+(3,4)然后调用operator+(7,5)。
有关操作符列表及其参数数量,请查看wikipedia: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B
要了解更多细节,请参阅StackOverflow的另一篇文章:
首先,您正在观察的问题与一般的成员函数完全无关。成员函数通常可以接受任意数量的"相同类"类型的参数。在你的例子中,你可以声明
class Fraction
{
void foo(Fraction &f1, Fraction &f2, Fraction &f3, Fraction &f4) {}
...
};
没有任何问题。所以,我不清楚你为什么决定把你的问题说得好像是关于一般的成员函数。
其次,在你的代码中,它实际上是一个简单的事实,你试图重载一个操作符。对于大多数(但不是全部)操作符,c++中的操作符语法是固定的。这立即意味着那些语法固定的操作符将具有固定数量的参数。在您的示例中,它是操作符*
。它可以是一元(一个参数)或二元(两个参数)。当您通过成员函数重载此操作符时,已经隐含了一个参数,因此您只能添加零个或一个额外参数(分别为一元*
和二进制*
)。另一方面,您试图在隐式参数之外添加两个更多参数。例如,您正在尝试定义一个三元操作符*
。这是不可能的。c++中没有三元*
运算符。这就是编译器告诉你的
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 如何解决一元"*"(有"字符")错误的无效类型参数?
- "std::shared_ptr":不是参数"_Ty"的有效模板类型参数
- 具有可变参数非类型参数的模板专用化
- 函数类型参数的模板参数推导
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 为模板传递非类型参数 agument
- 为什么带有类型参数的运算符 () 可以应用于 result_of 上下文中的类型?
- 使用其他模板类型参数作为要在函数签名中使用的类型别名声明
- 如何避免具有相同类型参数的函数中的错误
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- c++非类型参数包扩展
- 如何实现对参数顺序不可知的std::same_as的广义形式(即对于两个以上的类型参数)
- 在不同的模板参数包之间分发非类型参数包
- 如何在使用容器和字符串时强制使用显式分配器类型参数
- 错误:一元"*"的类型参数无效(具有"int"):使用 mergesort 计算
- EXPECT_CALL具有 unique_ptr 引用类型参数的模拟函数
- 作为模板类型参数,为什么 type[N] 与其专用版本不匹配----模板<类 T>类 S<T[]>
- C++ 模板:重载时找不到基类类型参数方法