Ответ 1
Проблема в том, что вы не можете создать шаблон typedef, также нет необходимости в typedef-структурах на С++.
Следующее сделает то, что вам нужно
template <typename T>
struct array {
size_t x;
T *ary;
};
Я играю с шаблонами. Я не пытаюсь заново изобрести std::vector, я пытаюсь понять шаблоны в С++.
Могу ли я сделать следующее?
template <typename T>
typedef struct{
size_t x;
T *ary;
}array;
То, что я пытаюсь сделать, - это базовая шаблонная версия:
typedef struct{
size_t x;
int *ary;
}iArray;
Похоже, что он работает, если я использую класс вместо struct, так что это невозможно с typedef structs?
Проблема в том, что вы не можете создать шаблон typedef, также нет необходимости в typedef-структурах на С++.
Следующее сделает то, что вам нужно
template <typename T>
struct array {
size_t x;
T *ary;
};
template <typename T>
struct array {
size_t x;
T *ary;
};
Вам не нужно делать явные typedef
для классов и структур. Для чего вам нужен typedef
? Кроме того, typedef
после a template<...>
является синтаксически неправильным. Просто используйте:
template <class T>
struct array {
size_t x;
T *ary;
} ;
Вы можете создать шаблон как для класса, так и для класса. Однако вы не можете создать шаблон typedef. Итак, template<typename T> struct array {...};
работает, но template<typename T> typedef struct {...} array;
нет. Обратите внимание, что нет необходимости в typedef trick в С++ (вы можете использовать структуры без модификатора struct
, просто отлично на С++).
В стандарте говорится (в 14/3. Для нестандартных людей имена, следующие за телом определения класса (или типом в объявлении вообще), являются "деклараторами" )
В декларации шаблона, явной специализации или явного экземпляра init-declarator-list в dec-laration должен содержать не более одного декларатора. Когда такое объявление используется для объявления шаблона класса, декларатор не разрешается.
Сделайте это, как показывает Андрей.
Синтаксис неверен. typedef
следует удалить.
Из других ответов проблема состоит в том, что вы создаете шаблон 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
}
}