2010-07-15 4 views

Répondre

3

Il existe deux syntaxes pour désigner les types de tableau. La première est la syntaxe type id et est utilisé partout où la langue attend un type de compilation, qui ressemble à:

T[constant-expression] 
T[] 

Cela spécifie un type de tableau qui, dans la première forme, a un certain nombre de éléments donnés par une expression constante entière (signifie qu'elle doit être connue au moment de la compilation). Dans la deuxième forme, il spécifie un type de tableau avec un nombre inconnu d'éléments. Similaires aux types de classe que vous déclarez sans corps, un tel type de tableau est dit incomplète, et vous ne pouvez pas créer des tableaux de ce type

// not valid: what size would it have? 
int a[]; 

Vous pouvez cependant, préciser ce type. Par exemple, vous pouvez TypeDef il

typedef int unknown_int_array[]; 

De la même manière, vous pouvez spécifier comme un argument de type de modèle, de sorte que la réponse à votre question est oui vous pouvez passer un tel type spécificateur à un modèle . Remarquez que je parle des spécificateurs ici, parce que le formulaire que vous utilisez ici n'est pas le type lui-même.

La deuxième façon est d'utiliser le nouveau type-id syntaxe qui permet de désigner les types d'exécution en ayant des bornes non constantes

T[expression] 

Ceci permet des variables qui passe en tant que compte d'éléments, et permet également le passage d'un zéro. Dans ce cas, un tableau d'éléments zéro est créé. Cette syntaxe est uniquement utilisable avec l'opérateur new pour la prise en charge des tableaux dynamiques.

0

La syntaxe de tableaux est déclarant

<type> <variable>[<size>]; 

Lorsque vous utilisez un modèle de la déclaration est, dans l'exemple

template <class T> 
    T var[4]; 
5

Le type d'un tableau "de type T" est T [dimension], qui est ce que vous pourriez passer en tant que paramètres de modèle. E.g .:

someTemplate<int [10]> t; // array type as template parameter 
int a[5]; // array of 5 ints named 'a' 

Les matrices doivent avoir une dimension qui doit être supérieure à 0. Cela signifie que par ex. U u[]; est illégale.

Il y a des cas qui pourraient apparaître comme des exceptions, les premiers paramètres d'être:

void f(T[]); 

Ceci est une règle spéciale pour les paramètres et f() est en fait équivalent à ce qui suit:

void f(T*); 

Ensuite, il est l'initialisation directe des réseaux:

int a[] = { 1, 2, 3, 4 }; 

Ici t La taille du tableau est implicitement donnée par le nombre d'éléments dans l'initialiseur, ainsi le type de a est int[4].

Il y a aussi incomplètes types de tableaux sans limites specificied, mais vous ne pouvez pas créer directement des instances de ces (voir Johannes réponse pour plus):

template<class T> struct X { typedef T type; }; 
X<int[]>::type a = { 1, 2, 3 }; 

Si vous êtes à la recherche de tableaux dynamiques, préfèrent conteneurs standard comme std::vector<T> à la place.

+0

So T ; n'est pas un code valide? – user383352

+0

Qu'en est-il de int [] someArray ;? – user383352

+3

Non, ce n'est pas valide. –

2

Si possible, vous pouvez utiliser à la place des tableaux dynamiques et passer un pointeur comme type de modèle. Tels que ...

T<int*> myVar; 
1

Cela a commencé comme un commentaire à la réponse de Georg, mais il a couru un peu long ...

Il semble que vous pourriez manquer une abstraction clé dans votre modèle mental de tableaux (au moins ceux de style C). Les tableaux locaux sont alloués sur la pile avec une taille codée en dur. Si vous avez un tableau dans une classe ou une structure, l'espace pour le tableau fait partie de l'objet lui-même (que ce soit sur la pile ou le tas). Les tableaux globaux peuvent même être représentés directement dans la taille de l'exécutable. Cela signifie qu'à chaque fois que vous souhaitez utiliser un tableau, vous devez spécifier sa taille au compilateur. La seule raison pour laquelle vous pouvez laisser les parenthèses vides dans une liste de paramètres est que les fonctions traitent les paramètres du tableau comme des pointeurs. La fonction ne serait guère utile si elle ne pouvait fonctionner que sur une taille de tableau.

Les modèles ne font pas exception. Si vous souhaitez que la taille du tableau modèle varie, vous pouvez ajouter un paramètre de modèle supplémentaire. Cependant, vous devez toujours spécifier la taille au moment de la compilation pour une instance donnée.

Questions connexes