7

テンプレートクラスがあるシナリオがあります

template<typename X, typename Y>
class Foo
{
 typedef Y::NestedType Bar;

 int A (Bar thing);
 void B();
 int C(X that);

 // other stuff
};

次に、Xが特定の型である場合にA()メソッドの動作を変えたいと思います(ただし、BとCは同じままで、実際のコードには実際には約10個の他のメソッドがあり、そのうちのいくつかは非常に長く、頻繁に調整する必要があるため、フルクラスの特殊化を避け、フルクラスの実装をコピーして貼り付けます)

私は続けて書いた:

template<typename T>
int Foo<MyType, T>::A(Bar thing);

しかし、私のコンパイラ(clang 163.7.1)は、これをあらゆる種類のテンプレートの特殊化と見なすことさえ拒否しました。

私がコードを書いた方法に隠された構文エラーがありますか、それともこのコーディングスタイルは無効なC ++ですか?残念ながら、他のコンパイラがこのイディオムをサポートしていても、私の会社はclangで立ち往生しています。

これについて助けてくれてありがとう。

4

1 に答える 1

7

オーバーロードを使用する

template<typename X, typename Y>
class Foo
{
 // allows to wrap up the arguments
 template<typename, typename>
 struct Types { };

 typedef Y::NestedType Bar;

 int A (Bar thing) {
   return AImpl(thing, Types<X, Y>());
 }

 void B();
 int C(X that);

 // other stuff
private:
  template<typename X1, typename Y1>
  int AImpl(Bar thing, Types<X1, Y1>) {
    /* generic */
  }

  template<typename Y1>
  int AImpl(Bar thing, Types<SpecificType, Y1>) {
    /* special */
  }
};

クラステンプレートのメンバーを部分的に特殊化することはできません。あなたが書いたAのは、クラステンプレート自体の部分的な特殊化のメンバー関数の定義です。

于 2011-08-18T19:10:20.467 に答える