0
template <typename T>
struct A
   {
   template <typename U>
   struct B;

   template <>
   struct B<int> {static const int tag = 1;};  // Works fine in VS2010
   };

どうすれば B を同じように特殊化できますが、A の外で行うことができます。これを試してみましたが成功しませんでした。

template <typename T> template <>
struct A<T>::B<int> {static const int tag = 1;};

私は得る:

error C3212: 'A<T>::B<int>' : an explicit specialization of a template member must be a member of an explicit specialization

クラス内で定義することで正確にそれを行うことができるので、意味がありません

VS2010の問題?間違った構文?

ありがとう


PS:これは(とにかく間違っているはずです、VS2010をクラッシュさせます):

template <> template <typename T>
struct A<T>::B<int> {static const int tag = 1;};
4

2 に答える 2

2

C++ 仕様、§14.17.3.18 を引用するには:

クラス テンプレートのメンバーまたは名前空間スコープに表示されるメンバー テンプレートの明示的な特殊化宣言では、メンバー テンプレートとその外側のクラス テンプレートの一部は、特殊化されていないままになる場合があります。囲んでいるクラス テンプレートも明示的に特殊化されていません。[...]

(私の強調)

これは、外側のテンプレート クラスも特殊化されていない限り、別のテンプレート クラス内にネストされたテンプレート クラスを特殊化できないことを示唆しています。したがって、VS2010 ではこの動作が間違っていて、g++ では正しいように見えます。

于 2011-02-02T23:54:53.673 に答える
1

それはそのようには機能しません.:-(

msvc は既定の設定でこれを受け入れますが、クラス宣言内で関数を特殊化することはできません。

また、囲んでいるクラスを特殊化せずにメンバー関数を特殊化することもできません。ほとんどのコンパイラはこれに賛成しました (言語標準と同様)。

于 2011-02-02T23:57:04.043 に答える