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).


Anmelden zum Antworten