2010-10-01 5 views
2

Dans ma bibliothèque, j'ai plusieurs fonctions initialize() et cleanup(), pour différents modules dont elle dépend.Plusieurs définitions de ma classe de modèles

Pour rendre cette partie plus sûr à utiliser, j'ai décidé de suivre la règle de RAII et édifiés une classe de modèle Initializer, qui prend deux fonctions en tant que paramètres:

// initializer.hpp (include guards omitted) 

template <void initialize(), void cleanup()> 
class Initializer 
{ 
    // Does something, but that's not relevant 
}; 

Maintenant, dans mon dossier xml.hpp J'ai ceci:

// xml.hpp (include guards omitted) 

namespace xml 
{  
    void initialize(); 
    void cleanup(); 

    typename ::Initializer<&initialize, &cleanup> Initializer; 
} 

cette compile très bien mais échoue sur la liaison car plusieurs fichiers comprennent xml.hpp et gcc se plaint qu'il ya plusieurs définitions pour xml::Initializer.

Que puis-je faire pour résoudre ce problème?

+2

'typename' ne semble pas à sa place ici, ou votre code posté est-il incomplet? gcc dit "error: using 'typename' en dehors du template". –

+0

@Charles Bailey: À ma place, il compilé, mais c'est en effet une erreur. Je l'ai juste changé pour "typedef" (ce que je voulais dire en premier lieu) et toutes les erreurs de liens ont disparu ... J'ai besoin de plus de café! Merci pour ça. Pouvez-vous ajouter une réponse pour que je l'accepte? – ereOn

Répondre

3
namespace xml 
{  
    void initialize(); 
    void cleanup(); 

    typename ::Initializer<&initialize, &cleanup> Initializer; 
} 

typename est illégal ici, il est seulement autorisé dans les définitions de modèle. Vous vouliez dire typedef!

namespace xml 
{  
    void initialize(); 
    void cleanup(); 

    typedef ::Initializer<&initialize, &cleanup> Initializer; 
} 
+0

En effet, je voulais dire «typedef»;) Merci de le remarquer! – ereOn

0

inclure votre code xml.hpp dans ces macros

#ifndef XML_HPP 
#define XML_HPP 

// Include code here 

#endif 
+0

Merci, mais j'ai déjà inclus les gardes. Je les ai juste omis pour la simplicité. – ereOn

2
typename ::Initializer<&initialize, &cleanup> Initializer; 

Ceci est une instanciation explicite. S'il vous plaît le mettre dans une et une seule unité de traduction

+1

Comme l'a souligné @Charles Bailey, c'était une faute de frappe ... Je voulais dire "typedef". Toujours, merci. J'ai juste besoin de plus de café je suppose ... +1;) – ereOn

+0

Mais je suppose que l'erreur concernait plusieurs définitions. S'il s'agissait d'un problème de nom de fichier, ce serait une erreur de syntaxe. Je suis confus – Chubsdad

+0

Mon compilateur ne s'est pas plaint d'une erreur de syntaxe. Il aurait été plus facile de repérer, en effet. Ma question comprend un exemple simplifié de mon code, peut-être c'est la raison pour laquelle il a passé la compilation. – ereOn

Questions connexes