Структура с шаблонными переменными в C ++ - PullRequest
60 голосов
/ 15 марта 2010

Я играюсь с шаблонами.Я не пытаюсь заново изобрести std :: vector, я пытаюсь понять шаблоны в C ++.

Могу ли я сделать следующее?

template <typename T>
typedef struct{
  size_t x;
  T *ary;
}array;

Что я 'я пытаюсь сделать это базовая шаблонная версия:

typedef struct{
  size_t x;
  int *ary;
}iArray;

Похоже, это работает, если я использую класс вместо struct, так что это невозможно с структурами typedef?

Ответы [ 7 ]

128 голосов
/ 15 марта 2010

Проблема в том, что вы не можете шаблонизировать typedef, также нет необходимости набирать структуры defdef в C ++.

Следующее будет делать то, что вам нужно

template <typename T> 
struct array { 
  size_t x; 
  T *ary; 
}; 
18 голосов
/ 15 марта 2010
template <typename T>
struct array {
  size_t x;
  T *ary;
};
9 голосов
/ 15 марта 2010

Вам не нужно делать явное typedef для классов и структур. Для чего вам нужен typedef? Кроме того, typedef после template<...> синтаксически неверно. Просто используйте:

template <class T>
struct array {
  size_t x;
  T *ary;
} ;
5 голосов
/ 15 марта 2010

Вы можете шаблонировать структуру, а также класс. Однако вы не можете создать шаблон для typedef. Так что template<typename T> struct array {...}; работает, а template<typename T> typedef struct {...} array; - нет. Обратите внимание, что в C ++ нет необходимости использовать трюк с typedef (вы можете использовать структуры без модификатора struct, что прекрасно в C ++).

4 голосов
/ 15 марта 2010

Стандарт гласит (в 14/3. Для нестандартных людей имена, следующие за телом определения класса (или тип в объявлении в целом), являются "деклараторами")

В объявлении шаблона, явной специализации или явном создании список инициаторов объявления в объявлении должен содержать не более одного декларатора. Когда такое объявление используется для объявления шаблона класса, объявление не допускается.

Делай, как показывает Андрей.

3 голосов
/ 15 марта 2010

Из других ответов проблема в том, что вы создаете шаблон typedef. Единственный «способ» сделать это - использовать шаблонный класс; т.е. базовое шаблонное метапрограммирование.

template<class T> class vector_Typedefs {
    /*typedef*/ struct array { //The typedef isn't necessary
        size_t x; 
        T *ary; 
    }; 

    //Any other templated typedefs you need. Think of the templated class like something
    // between a function and namespace.
}

//An advantage is:
template<> class vector_Typedefs<bool>
{
    struct array {
        //Special behavior for the binary array
    }
}
3 голосов
/ 15 марта 2010

Синтаксис неверен. typedef должен быть удален.

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