5

クラス宣言内で部分的なテンプレートの特殊化を使用できます

template<class T1, class T2>
struct A
{
    void foo() { cout << "general"; }
};

template<class T1>
struct A<T1, int>
{
    void foo() { cout << "partial specialization"; }
};

しかし、私がクラス宣言の外でそれをやろうとしているとき

template<class T1, class T2>
struct A
{
    void foo();
};


template<class T1, class T2>
void A<T1, T2>::foo() { cout << "general"; }

template<class T1>
void A<T1, int>::foo() { cout << "partial specialization"; }

次のエラーが発生します。

不完全な型の無効な使用«structA<T1、int>»

すべてのメンバーを再定義する場合は最初のアプローチを使用することは問題ありませんが、他のすべてのコードを重複させずに1つのメソッドのみを再定義する場合はどうでしょうか。

それで、クラス定義の外で部分的なテンプレートの特殊化を使用することは可能ですか?

4

4 に答える 4

3

失敗した例では:

template<class T1>
void A<T1, int>::foo() { cout << "partial specialization"; }

まだ定義していないAの特殊化を参照しています(2番目の例では完全なテンプレートのみを定義しています)。

参照する前にスペシャライゼーションを追加すると、実際に機能するはずです。

template <class T1>
struct A<T1, int>
{
  void foo ();
};

template <class T1>
void A<T1, int>::foo ()
{
  /* something */
};
于 2012-10-13T18:15:20.877 に答える
3

すべてのメンバーを再定義する場合は最初のアプローチを使用することは問題ありませんが、他のすべてのコードを重複させずに1つのメソッドのみを再定義する場合はどうでしょうか。

これは、特性テクニックを使用できる場所です。http://www.boost.org/community/generic_programming.html#traitsを参照してください

いくつかの使用法:

template <class T1, class T2>
struct ATraits {
   static void foo() {}
};

template <class T1>
struct ATraits<T1,int> {
   static void foo() {}
};

template <class T1, class T2>
struct A {
   void foo() { ATraits<T1,T2>::foo(); }
};
于 2012-10-13T20:38:05.097 に答える
2

外部テンプレートを完全に特殊化せずにメソッドを特殊化することは、c++標準では禁止されています。そうそう、それは不可能です。c ++ 11で有効かどうかはわかりませんが、有効だと思います。

これを回避する1つの方法は、最初の例で行ったように、外部テンプレートを特殊化することです。

ところで、これは別の回避策かもしれません:

template<class T1, class T2>
struct A
{
    template<unsigned int I>
    void foo() { cout << "general"; }

    template<>
    void foo<2> () { cout << "specialization"; }

};

これは特殊化ではなく、メソッドの異なるテンプレートであるため、これは機能します。

于 2012-10-13T17:51:09.720 に答える
0

同じトピックがここで説明されています: 部分的なテンプレートの特殊化による「不完全な型の無効な使用」エラー

tozkaのソリューションの+1。Aがfoo()を除いてIを知る必要がない場合、これは優れた回避策です。それ以外の場合は、上記の質問に対する回答をご覧ください。

于 2014-05-19T13:17:23.077 に答える