Подтвердить что ты не робот

Struct с переменными шаблона в С++

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

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

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

То, что я пытаюсь сделать, - это базовая шаблонная версия:

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

Из других ответов проблема состоит в том, что вы создаете шаблон 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
    }
}