2

ヘッダー ファイルにプロトタイプ化されたテンプレート クラス myClass があり、ヘッダー ファイルの末尾に含まれる .cpp ファイルに実装しています。コードを使用する場合:

template<typename T>
class myClass {
public:
    void myFunction(const T item);
};

ヘッダファイルと

template <class T>
void myClass<T>::myFunction(const T item)
{
//stuff
}

実装ファイルでは、実装コードの 2 行目で上記のエラーが発生します。別のプログラムでこれとまったく同じ構文を使用して、コンパイルが成功し、結果が正しく機能しているため、かなり混乱しています。.cpp ファイルには 3 つの異なる関数定義があり、すべての行で同じエラーが発生します。小さな間違いを犯していると思いますが、実際にはそれを理解できないようです。

ヘルプと説明は大歓迎です。

編集:

これは同じエラーを持つ SSCCE です: main.cpp

#include <iostream>
#include "myClass.h"

using namespace std;

int main(){
myClass<int> example;
example.myFunction(1);
return 0;
}

myClass.h

#include<iostream>

#ifndef MYCLASS_H_
#define MYCLASS_H_

template<typename T>
class myClass {
public:
    void myFunction(const T item);
};

#include "myClass.cpp"
#endif /* MYCLASS_H_ */

myClass.cpp

using namespace std;

template <class T>
void myClass<T>::myFunction(const T item)
{
    cout << "Hello World!";
}

GNU GCC コンパイラで Code::Blocks 10.05 を使用しています。

4

5 に答える 5

1

メソッドの実装もヘッダーファイルに入れます ( .h)

コンパイラは、翻訳単位での実装の詳細を知る必要があります。

于 2013-03-31T06:50:34.773 に答える
0

.hテンプレートをファイルで宣言し、それをファイルで定義するのは非常に困難.cppです。コンパイラは、コードを作成するために、単一のファイルでテンプレートの宣言と定義を必要とします。したがって、コンパイラがexportキーワードをサポートしていない場合、機能しません。したがって、宣言と定義に別のファイルを使用しないでください。このスレッドも参照してください。

于 2013-03-31T06:49:59.387 に答える
0

テンプレートはオンデマンドでインスタンス化され、コンパイラの設計で生じる複雑さを考慮して、ほとんどのコンパイラは、テンプレートの宣言と定義を 1 つのファイルに保持するための制限を作成します。そうでない場合、クラスと関数の定義の上にテンプレートを宣言すると、コンパイラがパターンを検出してテンプレートをインスタンス化するのが困難なパターンが作成されます。

同様の質問がStackoverflowで議論され、 Parashiftcplusplus.comで説明されています(記事の最後にあるテンプレートと複数ファイルのプロジェクトを参照してください)。

お役に立てれば!

ヴィベク

于 2013-03-31T07:14:06.757 に答える