-1

私はコードを持っています:

// class declaration
class Vector3D;

// class declaration and definition
class Point3D { 
    // ...

    // function declaration (only needs class declarations)
    Point3D operator+(const Vector3D &);
};

// class definition
class Vector3D {
    // ...
};

// function definition (needs class definitions)
inline Point3D Point3D::operator+(const Vector3D &vector) {
    // ...
}

しかし、私はエラーになります: 'Graphic :: Point3D :: operator +':redefinition; 異なるタイプ修飾子

4

3 に答える 3

3

あなたの質問のコードは整形式です。Visual C ++ 2012リリース候補は、エラーなしでコードを受け入れます(エラーのテキストは、Visual C ++エラーC2373のテキストと同じであるため、これについて説明します)。

コンパイラにバグがあるか、質問で提示したコードがコンパイルしているコードと同じではありません。


いずれの場合も:anoperator+はメンバー関数である必要はありません。非メンバー関数(または2つ、異なるオペランドの順序を処理するため)を使用する方が簡単です。

Point3D operator+(Point3D  const& lhs, Vector3D const& rhs);
Point3D operator+(Vector3D const& lhs, Point3D  const& rhs);

メンバー関数を保持する場合はoperator+、const修飾された左側の引数で呼び出すことができるように、それらはconst修飾されている必要があります。

Point3D operator+(const Vector3D &) const;
                                    ^ const required
于 2012-07-02T16:23:08.093 に答える
1

投稿したコードには何の問題もありません(インライン関数の定義が正しいファイルに配置されていると仮定しreturn、and ofのステートメントが欠落していることと、operator+設計上の問題が発生する可能性があります)。いくつかのコンパイラで報告された性質のエラーなしでコンパイルされます。

関数がinlineクラスで宣言されていないという事実に問題がある場合は、コンパイラのバグです。inlineC ++言語では、クラス、関数定義、またはその両方のどこに配置するかを決めるのは完全にあなた次第です。すべてが合法であり、すべて同じ効果があります。

コンパイラが「型修飾子」と呼んでいるように見えるという事実は、コンパイラにinline何か問題があることを示すもう1つの明らかな兆候です。inline型修飾子ではありません。

ただし、コンパイラが完全に正常であり、エラーメッセージが実際には他のエラーによって引き起こされている可能性がさらに高くなります。constたとえば、誤って配置された指定子は、投稿したコードに表示されないか、誤って表示されます。

于 2012-07-02T16:45:36.367 に答える
0

これを試して:

// class declaration
class Vector3D;

// class declaration and definition
class Point3D { 
    // ...

    // function declaration (only needs class declarations)
    inline Point3D operator+(const Vector3D &);
};

// class definition
class Vector3D {
    // ...
};

// function definition (needs class definitions)
inline Point3D Point3D::operator+(const Vector3D &vector) {
    // ...
}
于 2012-07-02T16:31:17.690 に答える