2

そのため、未解決の外部シンボル エラーが発生し、その理由がわかりません。すべてのファイルが同じプロジェクトに存在し、コンパイラはすべての obj ファイルを生成しているようです。私はテンプレート クラスから派生しているので、派生メソッドを適切に宣言していないのではないかと考えています。VS 2012 でビジュアル C++ コンパイラを使用しています。

BaseClass.h

template<class T> class BaseClass
{
public:
    BaseClass() {}

    virtual ~BaseClass() {}

    void Foo();
}

BaseClass.cpp

#include "BaseClass.h"

template<class T> void BaseClass<T>::Foo()
{
    cout << "hello";
}

SomeClass.h

#include "BaseClass.h"

class SomeClass : public BaseClass<long>
{
    public:
       SomeClass() {}

       void DoSomething();
}

SomeClass.cpp

#include "SomeClass.h"

void SomeClass::DoSomething()
{
     Foo(); // link error
     this->Foo(); // also gives link error
     BaseClass<long>::Foo(); // also gives link error
}

そのため、メソッド DoSomething() は、リンク エラーのために基本クラスから何も呼び出すことができないようです。ここで私が間違っていることは明らかですか?

4

2 に答える 2

2

テンプレートを作成すると、コンパイラは指定されたテンプレート引数で新しいクラスを作成します。したがって、コンパイラはメソッドの実装にアクセスする必要があり、リンクすることはできません。したがって、埋め込みを.cppファイルに分離することはできません。

宣言を埋め込みから本当に分離したい場合は、.inlファイルを調べる必要があります。詳細については、こちらをご覧ください。

于 2013-08-24T23:28:01.997 に答える