Специализированный шаблон для enum - PullRequest
5 голосов
/ 21 ноября 2010

Может кто-нибудь сказать мне, почему это не работает?

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

Ответы [ 4 ]

9 голосов
/ 21 ноября 2010

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

template <typename T>
struct Foo;

против ..

template <int N>
struct Foo;

Похоже, вы хотите специализировать свой шаблон на основе перечисления constant , а не типа.Это означает, что вы должны сказать:

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};
}
2 голосов
/ 21 ноября 2010

У вас есть специализированный 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;
}
2 голосов
/ 21 ноября 2010
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;
}
2 голосов
/ 21 ноября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...