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 scopebzgl. 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());
-
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