2

我正在阅读 Effective C++ (Scott Meyers),并在尝试编译本书中的以下代码时收到错误“no match for operator*”:

理性的.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;}
};

理性的.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() );
}

主文件

#include "rational.h"
int main()
{
    rational r1(1,2);
    rational r2;
    r2 = 2*r1;
    r2 = r1*3;
    return 0;
}

有人可以解释为什么会这样吗?

4

2 回答 2

5

您忘记告诉您的用户您的运营商的存在:

理性的.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);

这可以防止有时细微的错误,因为(在您的情况下)rationals 可能是无意创建的(请参阅Automatic Conversions)。

于 2012-04-12T15:36:18.123 回答
3

您尚未operator*在头文件中声明 ,因此在main.cpp.

于 2012-04-12T15:36:56.723 回答