web-dev-qa-db-fra.com

Struct avec des variables de template en C ++

Je joue avec des modèles. Je n'essaie pas de réinventer le std :: vector, j'essaie de comprendre les modèles en C++.

Puis-je faire ce qui suit?

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

Ce que j'essaie de faire est une version de base basée sur un modèle de:

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

Il semble que cela fonctionne si j'utilise une classe au lieu de struct, est-ce que cela n'est pas possible avec les structures typedef?

61
monkeyking

Le problème est que vous ne pouvez pas modéliser une typedef, il n'est pas non plus nécessaire de typedef structs en C++.

Ce qui suit fera ce dont vous avez besoin

template <typename T> 
struct array { 
  size_t x; 
  T *ary; 
}; 
129
Binary Worrier
template <typename T>
struct array {
  size_t x;
  T *ary;
};
18
Andrey

Vous n'avez pas besoin de faire un typedef explicite pour les classes et les structures. De quoi avez-vous besoin du typedef? De plus, le typedef après un template<...> est syntaxiquement faux. Utilisez simplement:

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

Vous pouvez modéliser une structure aussi bien qu'une classe. Cependant, vous ne pouvez pas modéliser un typedef. Alors template<typename T> struct array {...}; fonctionne, mais template<typename T> typedef struct {...} array; ne fait pas. Notez que l'astuce typedef n'est pas nécessaire en C++ (vous pouvez utiliser des structures sans le modificateur struct parfaitement en C++).

5
sepp2k

La norme dit (à 14/3. Pour les personnes non standard, les noms suivant un corps de définition de classe (ou le type dans une déclaration en général) sont des "déclarateurs")

Dans une déclaration de modèle, une spécialisation explicite ou une instanciation explicite, la liste init-declarator-list de la déclaration doit contenir au plus un déclarateur. Lorsqu'une telle déclaration est utilisée pour déclarer un modèle de classe, aucun déclarant n'est autorisé.

Faites-le comme le montre Andrey.

4

La syntaxe est fausse. Le typedef devrait être supprimé.

3
webgenius

Parmi les autres réponses, le problème est que vous modélisez un typedef. Le seul "moyen" de procéder consiste à utiliser une classe basée sur des modèles; c'est-à-dire la métaprogrammation de base du modèle.

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
Narfanator