2010-11-21 25 views
5

Bunun neden çalışmadığını bana söyleyebilir misiniz?Enum için özelleştirme şablonu

enum CompCriteria{ByKey,ByValue,ByeKeyAndValue}; 

template<class T> 
struct X; 

template<> 
struct X<CompCriteria> 
{ 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    X<CompCriteria::ByeKeyAndValue> x; 
    return 0; 
} 

cevap

2

Bir tür için X ürününüz var, ancak CompCriteria::ByeKeyAndValue tamsayı ile kullanmaya çalışıyorsunuz. Sen parametreli türleri ve parametreli değerlerin fikrini conflating ediyoruz

enum CompCriteria{ByKey,ByValue,ByeKeyAndValue}; 

template<int> 
struct X; 

template<> 
struct X<ByeKeyAndValue> 
{ 
}; 

int main() 
{ 
    X<ByeKeyAndValue> x; 
    return 0; 
} 
+0

Teşekkürler, işe yarıyor; –

2

bir template<class T> = template<typename T> ise T, iyi, bir tip olması bekleniyor Eğer varsa.

enum CompCriteria bir türdür, bu nedenle bu şablonu örnek ile başlatabilirsiniz. Ancak, enumun tek bir değeri bir tür değil, bu yüzden yapamazsınız.

2
enum CompCriteria{ByKey,ByValue,ByeKeyAndValue}; 

template<CompCriteria crit_> 
struct X 
{ 
    static const CompCriteria crit = crit_; 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    X<CompCriteria::ByeKeyAndValue> x; 
    return 0; 
} 
+0

@Someone_who_downwoted neden bu cevapta yanlış olan? En azından cesaretin var ve bu cevabı neden düşürdüğünü açıkla. Bu cevabı yararlı bulmak için +1 benden ve AFAIC istediğim şey bu. –

+0

Cevabınız için teşekkürler - denedim ve tam olarak istediğim şey bu. Çok teşekkürler. –

+0

@Alexey Malistov Cevabınız için teşekkür ederiz. gerçekten yararlı .. yukarı-oy.Şimdi bu satırdan bahset - şablon bunun ardında ne C++ şablonu var? –

9

şu şekildedir: bu durumda int -

Sen enum CompCriteria yatan türü için şablon sınıfını uzmanlaşabilir. Bir şablon parametresi bir tür veya bir sabit olabilir. Örneğin:

karşı
template <typename T> 
struct Foo; 

.. Bunun yerine bir tip daha bir enum sabit dayalı şablonu uzmanlaşmak istedikleri gibi görünüyor

template <int N> 
struct Foo; 

.

enum CompCriteria{ByKey,ByValue,ByeKeyAndValue}; 

template<CompCriteria> 
struct X; 

// Specialization for ByKeyAndValue 
// 
template<> 
struct X<ByeKeyAndValue> 
{ 
}; 

int main() 
{ 
    X<ByeKeyAndValue> x; // instantiate specialization 
    return 0; 
} 

Ayrıca, namespace operatörünü kullanarak çeteleler başvuramaz: Anlamı, söylemek gerekir. Enumlarınızı kapsüllemek istiyorsanız, bunları bir ad alanına sarmanız gerekir:

namespace CompCriteria 
{ 
    enum type {ByKey,ByValue,ByeKeyAndValue}; 
} 
+0

Teşekkürler harika cevap +1 –