0

SOでこれら 2 つのリンカー エラーに問題が発生した後、再び問題が発生しました。ただし、今回のソースは別の場所にあるようです。

コンパイラ エラーは、 signature を持つ関数が見つからないことを示しています""public: unsigned int __thiscall MyClass::myFunction<unsigned int>(int)const "

ただし、の内容を移動することは機能myClass.cppmain.cppます。理由がわかりません (他のすべてのコンテンツにmyClass.cppはこの問題はありません。(他の関数はテンプレート化されていません)。

myClass.h

#ifndef X
#define X
class MyClass {
public:
    template<class T>
    T myFunction (int someArgument) const;
};
#endif

myClass.cpp

#include "myClass.h"
template<class T>
T MyClass::myFunction (int someArgument) const {
    return T();
}

main.cpp

#include "myClass.h"
int main () {
    MyClass a();
    a.myFunction<unsigned int>(42);
    return 0;
}

この問題を解決するにはどうすればよいですか?

4

2 に答える 2

6

main.cpp では、コンパイラはテンプレート関数の定義を見つけることができるためです。

テンプレートはコンパイルできず、コンパイラはファイルの定義を確認できる必要があり、複数のファイルを確認することはできません。

myClass.h に myClass.cpp を含めるか、ヘッダーですべてを定義します。

于 2009-10-14T22:02:32.353 に答える
4

関数テンプレートは、ヘッダー ファイルで定義する必要があります。クラス メソッドのテンプレートは、その規則の例外ではありません。メソッドの定義を「MyClass.cpp」からヘッダー ファイル「MyClass.h」に移動します。

myClass.h

#ifndef X
#define X

class MyClass {
public:
    template<class T>
    T myFunction (int someArgument) const;
};

template<class T>
T MyClass::myFunction (int someArgument) const {
    return T();
}

#endif

「MyClass」の最初の非テンプレート メンバーまで、「MyClass.cpp」はまったく必要ありません。

于 2009-10-14T22:01:52.447 に答える