Структура с переменными шаблона в C++

Я играю вокруг с шаблонами. Я не пытаюсь переосмыслить станд.:: вектор, я пытаюсь получить схватывание templateting в C++.

Я могу сделать следующее?

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

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

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

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

61
задан Peter Mortensen 13 April 2010 в 08:43
поделиться

7 ответов

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

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

template <typename T> 
struct array { 
  size_t x; 
  T *ary; 
}; 
130
ответ дан 24 November 2019 в 17:02
поделиться

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

5
ответ дан 24 November 2019 в 17:02
поделиться

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

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

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

4
ответ дан 24 November 2019 в 17:02
поделиться

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

template <class T>
struct array {
  size_t x;
  T *ary;
} ;
9
ответ дан 24 November 2019 в 17:02
поделиться
template <typename T>
struct array {
  size_t x;
  T *ary;
};
18
ответ дан 24 November 2019 в 17:02
поделиться

The syntax is wrong. typedef должен быть удален.

3
ответ дан 24 November 2019 в 17:02
поделиться

Судя по другим ответам, проблема в том, что вы шаблонизируете типдеф. Единственный "способ" сделать это - использовать шаблонизированный класс; то есть, базовое метапрограммирование шаблонов.

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
ответ дан 24 November 2019 в 17:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: