2017-05-23 5 views
1

J'essaie de créer un simple programme C++ en utilisant code :: blocks et mingw, et je rencontre une erreur de liaison quelconque. Lorsque je tente de construire le projet, ld renvoie 1 sans détails supplémentaires. J'ai essayé de chercher en ligne des informations sur ce genre de problème, mais je n'ai rien trouvé.Le lieur échoue pour std :: map dans l'en-tête

J'essayé de déplacer la définition de exampletest.hpp-test.cpp, et cela ne résout le problème de liaison, mais il fait en sorte que je ne peux pas accéder à example d'autres fichiers qui importent test.hpp. J'ai également essayé de supprimer complètement l'espace de noms, mais je voudrais éviter cela pour des raisons d'organisation (si c'est un usage totalement inapproprié des espaces de noms que j'apprécierais savoir). J'essaye de faire en sorte que finalement plusieurs parties de mon programme puissent accéder et mettre à jour example pendant l'exécution.

test.hpp

#include <map> 
#include <string> 

namespace testing{ 

    std::map<std::string,int> example; 

} 

test.cpp

#include "test.hpp" 
#include <iostream> 

namespace testing { 

    std::map<std::string,int> example; 

} 

sortie de la construction

=== Build: Debug in SilhouetteEngine (compiler: GNU GCC Compiler) === 
error: ld returned 1 exit status 
=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) === 

Répondre

3

Il devrait y avoir un journal de construction plus complète quelque part, où il est dit que testing::example défini plusieurs fois.

La solution est simple: Seul déclare la variable dans le fichier d'en-tête, en utilisant le mot-clé extern:

// In header file 
namespace testing{ 
    extern std::map<std::string,int> example; 
} 
+0

Merci, il a été longtemps depuis que je pris un cours en C++ et je l'avais complètement oublié 'extern'. –