web-dev-qa-db-ja.com

「テンプレートパラメータなしで使用」

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

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();

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

24
synaptik

VisitedSetはテンプレートであり、クラスではないため、VisitedSet::getSize()などのネストされた名前指定子でVisitedSetを使用することはできません。すべての_class VisitedSet<T>_に対して_class T_の宣言を指定したように、すべての_class T_に対してVisitedSet<T>::getSize()の定義を指定する必要があります。

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

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

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

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

40
Jon Purdy

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

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

同様に、定義でテンプレートパラメータを指定する必要があります

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

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

2
Bo Persson

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

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

入れてみて

template <typename T>

visitedSet :: getSize()の実装の上-しかし、一般に、テンプレート化されたクラスと関数はすべてインライン化される必要があることに注意してください。詳細については、c ++ faq here を参照してください。

0
ds1848