同様の質問が以前に聞かれたことに気付きましたが、そのうちのいくつかを読みましたが、どこが間違っているのかわかりません。プロトタイプを定義から分離せずにクラスを作成するだけで、すべてが正常に機能します。以下に示すように、プロトタイプと定義を分離すると問題が発生します。
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();
テンプレートクラスを作成したことがないので、ここでの問題が些細なものである場合はご容赦ください。
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>
_の略です。
あなたはこれを求めている:
template <class T>
int VisitedSet<T>::getSize() {
return vec.size();
}
同様に、定義でテンプレートパラメータを指定する必要があります
template<class T>
int VisitedSet<T>::getSize() {
return vec.size();
}
そうでない場合、コンパイラはそれを宣言に一致させることができません。たとえば、一部のパラメータタイプには特殊化があります。
テンプレート関数でメソッドを実装していることをコンパイラーに知らせる必要があります。
template<typename T>
int VisitedSet<T>::getSize() {
return vec.size();
}
入れてみて
template <typename T>
visitedSet :: getSize()の実装の上-しかし、一般に、テンプレート化されたクラスと関数はすべてインライン化される必要があることに注意してください。詳細については、c ++ faq here を参照してください。