membre statique d'initialisation spécialisé de classe de modèle
class A
{
};
template <typename A, int S>
class B
{
public:
static int a[S];
B()
{
a[0] = 0;
}
};
template<> int B<A, 1>::a[1];
int main()
{
B<A, 1> t;
t;
}
Il compile avec GCC 4.1, mais n'ont pas de lien:
static.cpp:(.text._ZN1BI1ALi1EEC1Ev[B<A, 1>::B()]+0x5): undefined reference to `B<A, 1>::a'
Je préfère garder l'initialisation spécialisé s'il est possible, depuis le tableau contient certaines données spécifiques au type.
Ne serait pas B<A, 1>::un ont seulement 1 élément? Donc, par le référencement de B<A, 1>::a[1], n'êtes-vous pas d'indexation au-delà des limites du tableau?
Je ne vois pas
Je ne vois pas
typename A
faire tout.
OriginalL'auteur kaspy | 2010-02-26
Vous devez vous connecter pour publier un commentaire.
De membre statique spécialisations, si vous n'avez pas initialiser le membre, il est considéré comme une spécialisation déclaration, qui dit simplement: "Oh, ne pas instancier le membre depuis le premier modèle, car il est une institution spécialisée de définition de quelque part d'autre". Il convient de mentionner que la définition devrait apparaître dans une .fichier cpp (dans le cas contraire, vous gagnerez le contraire: plusieurs définitions), et la déclaration sans initialiseur doit toujours être placé dans le fichier d'en-tête.
Maintenant la syntaxe correcte est en effet le suivant, et il devrait pas apparaissent dans un fichier d'en-tête, mais dans un
.cpp
fichierSuivantes doivent toujours apparaître dans un fichier d'en-tête:
Ce sera la spécialisation déclaration.
À partir de cela, il s'ensuit que vous ne pouvez pas se spécialiser un membre qui ne dispose que d'un constructeur par défaut et n'est pas copiable, parce que vous devez cette syntaxe:
C++0x résout ce:
Pour la Standardese des gens parmi nous, voici les citations:
14.7.3/6
:14.7.3/15
:3.2/3
:3.2/5
:La restriction de cette "dont certains des paramètres du modèle ne sont pas spécifiés" signifie que nous sont permis de le faire, de le placer dans un en-tête (donc éventuellement avoir plusieurs définitions de cette spécialisation):
Dans votre cas, vous avez tous les paramètres spécifiés, il n'est pas couvert par une définition de la règle pour permettre à de multiples définitions.
OriginalL'auteur
Vous devez attribuer une valeur.
Pourquoi? Votre code est
error: conflicting declaration ‘int B<A, 1>::a’
.cette déclaration se spécialisera un entier membre, pas un tableau.
OriginalL'auteur
Il n'a pas de lien parce que vous ne définissez pas la valeur de votre membre statique.
Edit:
Btw: je préfère toujours utiliser boost::array au lieu de natif C-types:
OriginalL'auteur