Fehlermeldung, Templateklassen, Aufruf Methode aus Basisklasse



  • Hallo,

    ich habe zwei Templateklassen Base_NC

    template<class N, class C, class PC, class T> class Base_NC
    {
    private:
    	static LoggerPtr m_logger;
    
    	...
    protected:
    	LoggerPtr& logger() { return m_logger; }
    
    	...
    public:
    	virtual string str_id() const = 0;
    
    	...
    };
    

    und Coal_NC

    template<class N, class ON, class C, class CC, class PC, class T> class Coal_NC
    : public virtual Intern_NC<C>, public virtual NC_with_1_Nd<N, ON, C, PC, T>
    {
    private:
    	...
    public:
    	using Base_NC<N, C, PC, T>::logger;
    	void log_prob_acids();
    
    	...
    };
    

    wobei Coal_NC mittelbar aus Base_NC abgeleitet ist (über NC_with_1_Nd). Wenn ich nun log_prob_acids als

    template<class N, class ON, class C, class CC, class PC, class T> void Coal_NC<N, ON, C, CC, PC, T>::log_prob_acids()
    {
    	int id = 0;
    	LOG4CXX_DEBUG(logger(), "id: " << id);
    	LOG4CXX_DEBUG(logger(), "id: " << Base_NC<N, C, PC, T>::str_id());
    }
    

    definiere, erhalte ich die Fehlermeldung

    ../src/node/base_nc_def.h:267:66: error: macro "LOG4CXX_DEBUG" passed 5 arguments, but takes just 2
    ../src/node/base_nc_def.h: In member function ‘void Coal_NC<N, ON, C, CC, PC, T>::log_prob_acids()’:
    ../src/node/base_nc_def.h:267: error: ‘LOG4CXX_DEBUG’ was not declared in this scope

    bzgl. der Zeile

    LOG4CXX_DEBUG(logger(), "id: " << Base_NC<N, C, PC, T>::str_id());
    

    LOG4CXX_DEBUG ist ein Makro aus der Logging-Bibliothek log4cxx und erwartet einen sogenannten Logger und die auszugebende Nachricht (ich hoffe die obige Zeile

    LOG4CXX_DEBUG(logger(), "id: " << id);
    

    illustriert, wie es zu benutzen ist (die Zeile kompiliert)).

    Weiss jemand, wie man das richtig macht (ohne using zu benutzen)?



  • Makros mögen keine Parameter mit Kommata. Das ist das Problem.



  • Ein ekliger Weg das zu übergehen ist es, indem du
    #define _MEIN_KOMMA ,
    definierst, und das anstelle der Kommata deiner Templateparamter in dem Makroaufruf verwendest.

    EDIT:

    Wäre dann:

    #define _MEIN_KOMMA , 
    //... define muss natürlich nach dem include von log4cxx
    LOG4CXX_DEBUG(logger(), "id: " << Base_NC<N _MEIN_KOMMA C _MEIN_KOMMA PC _MEIN_KOMMA T>::str_id());
    

  • Administrator

    Noch eine Alternative, welche in diesem Fall funktionieren könnte. Aber Achtung, das geht nicht immer, da die Klammern direkt mitübernommen werden.

    LOG4CXX_DEBUG(logger(), ("id: " << Base_NC<N, C, PC, T>::str_id()));
    

    Grüssli


Anmelden zum Antworten