Benutzerdefinierte Manipulatoren als Templates
-
Hallo,
ich wuerde mir gerne Manipulatoren definieren, um fuer meine Klassen angeben zu koennen, auf welcher Detailstufe ihre data members mittels << ausgegeben werden sollen.
Bei der Implementation orientiere ich mich an 21.4.6.3 aus dem Stroustrup. Da ich explizite Instanzierung benutzen moechte habe ich drei Dateien (Rev_Nd ist irgendeine meiner Klassen)
io.h
// manipulator for setting how much details one get template<class T> class Det_Manip { friend ostream& operator<<<T>(ostream& s, const Bound_Det_Manip<T>& bdm); private: int m_level; public: explicit Det_Manip(int level) : m_level(level) { } int level() const { return m_level; } Bound_Det_Manip<T> operator()(const T* n) const { return Bound_Det_Manip<T>(*this, n); } }; // bound detail manipulator template<class T> class Bound_Det_Manip { private: const Det_Manip<T>& m_det_manip; const T* m_data; public: Bound_Det_Manip(const Det_Manip<T>& dm, const T* t) : m_det_manip(dm), m_data(t) { } const Det_Manip<T>& det_manip() const { return m_det_manip; } const T* data() const { return m_data; } };
io_def.h
#include "standard.h" #include "io.h" ostream& operator<<(ostream& s, const Bound_Det_Manip<Rev_Nd>& bdm) { ... // schreib was in s return s; }
io.cpp
#include "io_def.h" template class Det_Manip<Rev_Nd>; template class Bound_Det_Manip<Rev_Nd>; ostream& operator<<(ostream& s, const Bound_Det_Manip<Rev_Nd>& bdm);
Wenn ich nun in meiner Anwendung
ostream& operator<<(ostream& s, const Rev_Nd& n) { const Bound_Det_Manip<Rev_Nd>& bdm = Det_Manip<Rev_Nd>(0)(&n); s << bdm; return s; }
schreibe, erhalte ich bzgl.
s << bdm;
die Fehlermeldung
undefined reference to `std::basic_ostream<char, std::char_traits<char> >& operator<< <Rev_Nd> (std::basic_ostream<char, std::char_traits<char> >&, Bound_Det_Manip<Rev_Nd> const&)'
Weiss jemand, was ich hier falsch mache?
-
Was soll denn die Deklaration von op<< in io.cpp?
-
Michael E. schrieb:
Was soll denn die Deklaration von op<< in io.cpp?
Das war als explizite Instanzierung gedacht (inzwischen beschleicht mich allerdings der Verdacht, dass das alles ziemlicher Murks war, den ich da produziert habe).