2010-08-22 9 views
3

j'ai quelque chose comme ça dans mon code:Définitions multiples étranges d'erreur

namespace A { 
namespace B { 

void 
GetLine(std::istream& stream, std::string& line) 
{ 
    line.clear(); 
    while (stream.good()) { 
     std::getline(stream, line); 
     boost::trim(line); 
     if (not line.empty()) break; 
    } 
    boost::to_upper(line); 
} 

} 
} 

Et je reçois plusieurs erreurs de définition à chaque fois que j'appelle A::B::GetLine. Des idées pourquoi?

(Le code est au travail, donc je vais essayer de donner des extraits spécifiques si vous avez besoin de plus d'informations, mais je ne peux pas simplement passer le code entier ici).

+0

Vous ne pouvez pas publier le message d'erreur du compilateur? Peut-être que cela nous indiquera quelque chose d'autre qui n'est pas dans l'extrait ci-dessus. – David

+2

Essayez-vous de lier dans le fichier objet plusieurs fois? Jetez un oeil à votre makefile pour voir si le .o contenant cette fonction est passé au compilateur plusieurs fois. Je suppose que vous êtes sur un système unix ou unix, mais une autre chose que vous pouvez faire est d'exécuter "nm --demangle" sur tous vos fichiers objets et de rechercher A :: B :: GetLine pour voir si apparaît comme "défini" dans plusieurs fichiers .o. – George

+0

+1 pour le nm --demangle – Chubsdad

Répondre

4

Vous avez presque certainement inclus le code dans plusieurs en-têtes, plutôt que de déclarer dans un en-tête et de le définir dans un fichier source. Vous devez déclarer la fonction en ligne, la modéliser ou la déplacer dans un fichier source, mais laisser la déclaration dans un en-tête.

+0

Si simple ... Merci! –

1

Votre problème est que vous avez probablement ce code dans un fichier .h et l'inclure dans plusieurs fichiers .cpp. La solution consiste à utiliser mot-clé en ligne pour faire le compilateur inline et supprimer la référence:

namespace A { 
namespace B { 

inline void 
GetLine(std::istream& stream, std::string& line) 
{ 
    line.clear(); 
    while (stream.good()) { 
     std::getline(stream, line); 
     boost::trim(line); 
     if (not line.empty()) break; 
    } 
    boost::to_upper(line); 
} 

} 
} 

Une autre solution consiste à déplacer le corps de la méthode dans un fichier .cpp.