36

テンプレートに関する完全なガイドを読んでいますが、次のように書かれています。

クラステンプレートの特殊化について話しているところ。

クラス テンプレートの 1 つのメンバー関数を特殊化することは可能ですが、いったん特殊化すると、特殊化されたメンバーが属するクラス テンプレート インスタンス全体を特殊化することはできなくなります。

メンバー関数がまったくなくても特殊化できるため、これがどのように当てはまるのか実際に疑問に思っています。メンバー関数を 1 つだけ持つ特殊化と、すべてのメンバー関数を持つ別の特殊化を行うことはできないということですか?

誰かが明確にしてもらえますか?

4

2 に答える 2

38

次のケースを指していると思います。

template <typename T>
struct base {
   void foo() { std::cout << "generic" << std::endl; }
   void bar() { std::cout << "bar" << std::endl; }
};
template <>
void base<int>::foo() // specialize only one member
{ 
   std::cout << "int" << std::endl; 
}
int main() {
   base<int> i;
   i.foo();         // int
   i.bar();         // bar
}

それが完了すると、完全なテンプレートを他のものに特化することはできません。

template <>
struct base<int> {};  // error
于 2011-05-10T12:50:54.183 に答える
3

つまり、次のいずれかを実行できるということです。

  • クラス全体を特化し、すべてのメンバー (データと関数、静的かどうか、仮想かどうか) は、非特化バージョンと同じであっても宣言および定義する必要があります。

  • 一部の関数メンバーを特殊化しますが、クラス全体を特殊化することはできません (つまり、すべてのメンバーは非特殊化の場合と同じ方法で宣言され、一部の関数メンバーの実装を提供するだけです)。

于 2011-05-10T12:50:09.510 に答える