2010-11-21 3 views

ответ

2

У вас есть специализированный X для типа, но вы пытаетесь использовать его с целым числом CompCriteria::ByeKeyAndValue.

Вы можете специализироваться класс шаблона для enum CompCriteria базового типа - int в этом случае следующим образом:

enum CompCriteria{ByKey,ByValue,ByeKeyAndValue}; 

template<int> 
struct X; 

template<> 
struct X<ByeKeyAndValue> 
{ 
}; 

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

спасибо, это работает; –

2

Если у вас есть template<class T> = template<typename T>, то T, как ожидается, будет, ну типа.

enum CompCriteria - это тип, поэтому вы можете создать экземпляр этого шаблона с ним. Однако одно значение перечисления не является типом, поэтому вы не можете.

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 почему в этом нет ответа? По крайней мере, есть кишки и объясните, почему вы отказались от этого ответа. +1 от меня, потому что я нахожу этот ответ полезным и AFAIC - это то, что я хотел. –

+0

Благодарю вас за ответ. Я пробовал, и это именно то, что я хотел. Большое спасибо. –

+0

@ Алексей Малистов Спасибо за ответ. действительно полезно .. up-voted. Можете ли вы упомянуть эту строку - шаблон , что за правило шаблона C++? –

9

Вы приравнивая идею параметризованных типов и параметризованных значений. Параметром шаблона может быть тип или константа. Например:

template <typename T> 
struct Foo; 

против ..

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; 
} 

Кроме того, вы не можете обратиться к перечислениям с помощью оператора namespace. Если вы хотите инкапсулировать свои перечисления, вам необходимо обернуть их в пространство имен:

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

Спасибо большое ответ +1 –

Смежные вопросы