2010-05-22 7 views
1

J'ai une classe qui a un tableau de const statique, il doit être initialisé en dehors de la classe:const statique C++ membre de classe initialisé donne une erreur de symbole en double lors de la liaison

class foo{ 
static const int array[3]; 
};  
const int foo::array[3] = { 1, 2, 3 }; 

Mais je reçois un symbole en double foo :: array dans foo.o et main.o foo.o contient la classe foo, et main.o contient main() et utilise des instances de foo.
Comment puis-je partager ce tableau de const statique entre toutes les instances de foo? Je veux dire, c'est l'idée d'un membre statique.

Répondre

7

Initialisez-le dans votre fichier .cpp correspondant et non dans votre fichier .h.

Lorsque vous #include c'est une directive de pré-processeur qui copie fondamentalement le fichier verbatim dans l'emplacement du #include. Vous l'initialisez donc deux fois en l'incluant dans deux unités de compilation différentes.

L'éditeur de liens voit 2 et ne sait pas lequel utiliser. Si vous l'aviez seulement initialisé dans l'un des fichiers sources, un seul .o le contiendrait et vous n'auriez pas de problème.

+0

Oui, c'est vrai. Merci! Je continue de faire ces erreurs stupides avec des fichiers d'en-tête et d'obtenir des erreurs de liens. – Petruza

+1

J'avais une question à ce sujet - Pourquoi les gardes d'en-tête ne résolvent-ils pas le problème? - Merci, Sid. – Opt

+0

Les protecteurs d'en-tête fonctionnent uniquement dans le cadre d'une unité de compilation, telle qu'un fichier .cpp. Si vous avez plusieurs fichiers .cpp dans votre projet, chacun d'entre eux est compilé en tant qu'unité séparée. Si elles incluent le même en-tête, il sera inclus pour chaque fichier .cpp, ainsi le symbole sera multiplié. – Sean

Questions connexes