Ambiguity durch Namespaces



  • Hallo,

    ich würde gerne in meinem Programm anfangen, Namespaces zu nutzen und bin dabei auf folgendes Problem gestoßen: Ich habe im File MCMC.h alles in einen Namespace MCMC gepackt

    #ifndef MCMC_H
    #define MCMC_H
    
    #include "standard.h"
    
    namespace MCMC {
    	class Results_MCMC
    	{
    		...
    	};
    
    	...
    }
    
    #endif
    

    Wenn ich das nun in main.cc benutze

    #include "standard.h"
    
    #include "classftn.h"
    ...
    #include "MCMC.h"
    ...
    
    using namespace MCMC;
    
    int main(int argc, char** argv)
    {
    	...
    	Results_MCMC res_mcmc = cls.log_prob_var(tip_seqs, 30, 1);
    	...
    }
    

    erhalte ich die Fehlermeldung

    ../main.cc: In function ‘int main(int, char**)’:
    ../main.cc:76: error: reference to ‘Results_MCMC’ is ambiguous
    ../src/classification/classftn.h:9: error: candidates are: struct Results_MCMC
    ../src/classification/MCMC.h:14: error: class MCMC::Results_MCMC

    da in classftn.h (wird von main.cc eingebunden) mittels

    #define CLASSFCTN_H
    
    #include "standard.h"
    
    #include "empty.h"
    
    class Results_MCMC;
    
    ...
    
    #endif
    

    Results_MCMC vorab deklariert wird. Kann man diese Vorabdeklaration irgendwie umformulieren, dass der Compiler weiss, dass ich bezug auf MCMC::Results_MCMC nehmen will? Oder gibt es andere Lösungen?



  • Die Vorwärtsdeklaration kannst du auch in den Namespace packen.

    Aber irgendwie ist es doch überflüssig, im Namespace MCMC die Klassen noch mit _MCMC zu ergänzen, oder? 😉



  • Nexus schrieb:

    Die Vorwärtsdeklaration kannst du auch in den Namespace packen.

    Muss ich dann classftn.h wie folgt umschreiben

    #define CLASSFCTN_H
    
    #include "standard.h"
    
    #include "empty.h"
    
    namespace MCMC {
        class Results_MCMC;
    }
    
    ...
    
    #endif
    

    oder gibt es da irgendwelche besseren Alternativen?

    Nexus schrieb:

    Aber irgendwie ist es doch überflüssig, im Namespace MCMC die Klassen noch mit _MCMC zu ergänzen, oder? 😉

    Das stimmt. Die Namensgebung ist hier historisch bedingt (bisher hatte ich ja keine Namespaces benutzt).



  • ingobulla schrieb:

    Muss ich dann classftn.h wie folgt umschreiben [...] oder gibt es da irgendwelche besseren Alternativen?

    Nein, du musst es so machen. Was verstehst du unter einer "besseren" Alternative?

    Und ausserdem würde ich mit using namespace sparsam umgehen. Namensräume haben keinen Sinn, wenn man sie immer global bekannt macht.



  • Nexus schrieb:

    Nein, du musst es so machen. Was verstehst du unter einer "besseren" Alternative?

    Im Wesentlichen zielte die Frage darauf ab, ob ich deine Erklärung korrekt verstanden habe (insbesondere bezüglich der genauen programmiertechnischen Umsetzung).


Log in to reply