Шаблоны, параметризованные для перечислений - PullRequest
0 голосов
/ 19 марта 2012

Я хочу сделать это:

template <enum Type>
class Message {
private:
     Type m_type
};

enum StdInMessages { PrintHello, Echo, ... };
class StdInMsg : Message<StdInMessages>
{ ... }

enum NetworkMessages { DoSomethingElse, Shutdown ... };
class NetworkMsg : Message<NetworkMessages>
{ ... }

Конечно, фактические сообщения немного отличаются

Почему это не работает?

template <enum T> class ATemplate {};

Iполучить эту ошибку

error: use of enum ‘T’ without previous declaration

Ответы [ 2 ]

2 голосов
/ 19 марта 2012

Работает, если enum T объявлено заранее:

enum T {
    foo, bar
};

template <enum T> // or simply `template <T>`
class ATemplate { };

int main() {
    ATemplate<foo> x;
}

Но, судя по имени переменной T, это не то, что вам нужно. Поскольку трудно угадать, чего именно вы хотите, вам нужно быть более конкретным.

1 голос
/ 19 марта 2012

Потому что это недопустимый синтаксис для шаблона , если только то, что вы ищете - это то, на что Конрад ответил .

Вам необходимо использовать typename или class.

Следующее должно сделать это:

enum X
{
   a
};

template <typename T> class ATemplate {};

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