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?
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;
};
template <typename T>
struct array {
size_t x;
T *ary;
};
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;
} ;
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++).
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.
La syntaxe est fausse. Le typedef
devrait être supprimé.
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
}
}