1

cnVector.cppで実装が記述されているcnVector.hというヘッダーファイルがあります。これらの2つのファイルは同じディレクトリにあります。

cNormalCBP/
   + src/
       + cNormal/
           + cnUtils/
               - cnVector.h
               - cnVector.cpp
       - main.cpp

ヘッダーには、単純なクラス定義が含まれています。

class cnVector {
    public:
        cnVector(double, double, double);

        inline cnVector cross(const cnVector&) const;
};

.cppファイルの実装は次のとおりです。

#include "cnVector.h"
/* constructor */   cnVector::cnVector(double x, double y, double z)
        : x(x), y(y), z(z) {
}

cnVector cnVector::cross (const cnVector& vOther) const {
    return cnVector(
        y * vOther.z + z * vOther.y,
        z * vOther.x + x * vOther.z,
        x * vOther.y + y * vOther.x );
}

ここで、main.cppの次のコードは、 cnVector :: cross(cnVector const&)const;への未定義の参照が原因で、3行目で壊れています。 コンストラクターの実装は認識されますが、メソッドは認識されないことに注意してください。
cnVector::cross

int main() {
    cnVector v1(1, 0, 0), v2(0, 1, 0);
    cnVector v3 = v1.cross(v2);
}

また、エラーメッセージの警告が表示されます。インライン関数'cnVector cnVector :: cross(const cnVector&)const'が使用されていますが、定義されていません
実装をmain.cppにコピーすると機能します。

cnVectorインスタンスを作成できるのに、他のメソッドの実装が認識されない理由を説明していただけますか?

4

1 に答える 1

2

インライン関数をヘッダーファイルに移動します。インライン関数は、コードの他の部分とどのように統合されるかにより、ヘッダーファイルで定義全体を必要とします。コンパイラは(おそらく)関数が呼び出されるすべての場所にコードを挿入しようとするため、テンプレートがヘッダーファイルに完全に存在する必要があるのと同様に、ヘッダーファイルにコードを表示する必要があります。

于 2011-10-25T19:54:46.250 に答える