34

以前にも同様の質問があったことはわかっていますが、それらをいくつか読んでも、どこが間違っているのかわかりません。プロトタイプを定義から分離せずにクラスを作成するだけで、すべてが正常に機能します。以下に示すように、プロトタイプと定義を分離すると、問題が発生します。

template<class T> class VisitedSet { 
public:
    VisitedSet(); 
    int getSize(); 
    void addSolution(const T& soln); 
    void evaluate(); 
private:
    vector<T> vec;
    int iteration;
};

そして、私にこのエラーを与える定義の例として:

int VisitedSet::getSize() {
    return vec.size();

テンプレート化されたクラスをこれまで作成したことがないので、ここでの問題が些細なものである場合はご容赦ください。

4

5 に答える 5

51

VisitedSetVisitedSetはテンプレートであり、クラスではないため、などのネストされた名前指定子では使用できませんVisitedSet::getSize()class VisitedSet<T>for allの宣言を指定したのと同じように、 for allclass Tの定義を指定する必要があります:VisitedSet<T>::getSize()class T

template<class T>
int VisitedSet<T>::getSize() {
//            ^^^
    return vec.size();
}

ただし、テンプレートの名前は、テンプレート定義内のクラスであるかのように使用できます。

template<class T>
struct Example {
    Example* parent;
    T x, y;
};

この場合、Exampleはの略ですExample<T>

于 2012-04-21T21:25:26.357 に答える
3

あなたはこれを求めている:

template <class T>
int VisitedSet<T>::getSize() {
    return vec.size();
}
于 2012-04-21T21:10:43.590 に答える
2

定義にもテンプレートパラメータを記載する必要があります

template<class T>
int VisitedSet<T>::getSize() {
    return vec.size();
}

そうしないと、コンパイラはそれを宣言と一致させることができません。たとえば、一部のパラメータタイプに特化している可能性があります。

于 2012-04-21T21:10:55.823 に答える
2

テンプレート関数にメソッドを実装していることをコンパイラに通知する必要があります。

 template<typename T>
 int VisitedSet<T>::getSize() {
    return vec.size();
 }
于 2012-04-21T21:11:05.447 に答える
0

入れてみてください

template <typename T>

VisitedSet :: getSize()の実装の上にありますが、一般に、テンプレート化されたクラスと関数はすべてインライン化する必要があることに注意してください。詳細については、こちらのc++に関するよくある質問をご覧ください。

于 2012-04-21T21:09:44.590 に答える