20
struct Bar {
  enum { Special = 4 };
};

template<class T, int K> struct Foo {};
template<class T> struct Foo<T,T::Special> {};

使用法:

Foo<Bar> aa;

T::Specialgcc 4.1.2 を使用してコンパイルに失敗します。Foo の部分的な仕様化のための の使用について不平を言います。クラスの場合Special、解決策はその前のタイプ名になります。列挙型 (または整数) に相当するものはありますか?

4

2 に答える 2

16

Prasoon で説明されているように C++ では許可されていないため、別の解決策はEnumToTypeクラス テンプレートを使用することです。

struct Bar {
  enum { Special = 4 };
};

template<int e>
struct EnumToType
{
  static const int value = e;
};

template<class T, class K> //note I changed from "int K" to "class K"
struct Foo
{};

template<class T> 
struct Foo<T, EnumToType<(int)T::Special> > 
{
   static const int enumValue = T::Special;
};

ideone のサンプルコード: http://www.ideone.com/JPvZy


または、このように単純に特化することもできます (問題が解決する場合)。

template<class T> struct Foo<T,Bar::Special> {};

//usage
Foo<Bar, Bar::Special> f;
于 2010-12-28T05:28:59.037 に答える
9

非型テンプレート引数の型は、部分的な特殊化のテンプレート パラメーターに依存できません。

ISO C++03 14.5.4/9 は言う

部分的に特殊化された非型引数式は、引数式が単純な識別子である場合を除き、部分的な特殊化のテンプレート パラメーターを含んではなりません。

template <int I, int J> struct A {};
template <int I> struct A<I+5, I*2> {}; //error
template <int I, int J> struct B {};
template <int I> struct B<I, I> {};     //OK

に依存するtemplate<class T> struct Foo<T,T::Special> {};ため、このようなものは違法ですT::SpecialT

使用も違法です。テンプレート引数を 1 つ指定しましたが、2 つ指定する必要があります。

于 2010-12-28T05:04:15.847 に答える