我正在阅读Effective C ++(Scott Meyers),并在尝试编译本书中的以下代码时收到错误“与运算符*不匹配”:
rational.h
class rational
{
private:
int num;
int den;
public:
rational(int n = 0, int d = 1);
int getNum() const {return num;}
int getDen() const {return den;}
};
rational.cpp
#include "rational.h"
rational::rational(int n,
int d)
:num(n),
den(d)
{}
const rational operator*(const rational &lhs,
const rational &rhs)
{
return rational( lhs.getNum()*rhs.getNum(),
lhs.getDen()*rhs.getDen() );
}
的main.cpp
#include "rational.h"
int main()
{
rational r1(1,2);
rational r2;
r2 = 2*r1;
r2 = r1*3;
return 0;
}
有人可以解释为什么会这样吗?
答案 0 :(得分:5)
您忘了告诉您的用户您的运营商是否存在:
rational.h
...
const rational operator*(const rational &lhs,
const rational &rhs);
...
通常,在C和C ++中,我们都谈论“定义”和“声明”。声明是使某些东西对其他人可见的注释,但它本身却什么都不做。定义是实际做某事的权利:
int foo(); // <- we call it "declaration"
int foo() { return 0; } // <- we call it foo's "definition"
在你的代码中,main.cpp中没有operator*
的可见声明,所以你需要在某个地方提供一个(理想情况下在你的理性标题中)。
作为样式建议:在几乎所有情况下,如果构造函数采用内置类型,您希望将其明确化:
explicit rational (int, int);
这可以防止有时会出现微妙的错误,因为(在您的情况下)rational
可能会被无意创建(请参阅Automatic Conversions)。
答案 1 :(得分:3)
您尚未在头文件中声明operator*
,因此在main.cpp
中无法显示。{/ p>