何とか私はこれを理解できませんanswer。ショートハンド表記がクラス外で動作しないのはなぜですか?
メンバ関数は、クラス外で定義されている場合、なぜ我々はテンプレート宣言は、右のメンバーの前に繰り返された後も、(たとえばFoo::Foo(){}
ための代わりより冗長Foo<T>::Foo(){}
を持つ)、単純なネストされた名前指定子を持つことができません関数定義。
何とか私はこれを理解できませんanswer。ショートハンド表記がクラス外で動作しないのはなぜですか?
メンバ関数は、クラス外で定義されている場合、なぜ我々はテンプレート宣言は、右のメンバーの前に繰り返された後も、(たとえばFoo::Foo(){}
ための代わりより冗長Foo<T>::Foo(){}
を持つ)、単純なネストされた名前指定子を持つことができません関数定義。
微妙な
template<class T>
int VisitedSet::getSize() {
return vec.size();
}
C++コンパイラでT
が適用される、まだ何か分からないだろうということです。 VisitedSetのクラス定義の中で作業しているときは、を明白に使用できますが、その外側は機能しません。
クラス定義外の場合、構文では、tempate<class T>
構文を使用しているテンプレートパラメータをコンパイラに指示し、コンパイラに適用する場所をコンパイラに指示する必要があります。あいまいなようだが、次のネストされたケースを考えることができる。この場合
、:
template<class T>
class Foo {
template<class R>
class Bar {
int getSize();
};
};
あなたが具体的にする必要がある理由それから、より明らかです:
template<class X, class Y>
int Foo<Y>::Bar<X>::getSize() { ...
と
template<class A, class B>
int Foo<A>::Bar<B>::getSize() { ...
の両方が有効です。
あなたも、あなたがにリンクの答えに示す単純な場合には
template<class T>
int VisitedSet<T>::getSize() {
return vec.size();
}
を必要とする理由だからです。
*テンプレートクラス*は、誤った名前です。これはクラステンプレートであり、クラスを作成するためのテンプレートであり、クラス自体ではありません。 – NathanOliver