2

私はEffectiveC++(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;
}

誰かがこれが起こっている理由を説明できますか?

4

2 に答える 2

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にvisibleの宣言がないoperator*ため、どこかに(理想的には、rationalのヘッダーに)指定する必要があります。

スタイルのアドバイスとして:ほとんどすべての場合、コンストラクターが組み込み型をとる場合は、それを明示的にする必要があります。

explicit rational (int, int);

これにより、(あなたの場合)rationalが意図せずに作成される可能性があるため、微妙なバグを防ぐことができます(自動変換を参照)。

于 2012-04-12T15:36:18.123 に答える
3

operator*ヘッダーファイルでを宣言していないため、に表示されませんmain.cpp

于 2012-04-12T15:36:56.723 に答える