operator= überladen bei Templates



  • Hi,

    ich steh hier grad nen bissel auffem Schlauch und komm nicht weiter...
    Hab ne Template-Klasse, die im Grunde so aussieht:

    template<class T>
    class CVar
    {
      T m_Value;  
    }
    

    Jetzt will ich den operator= überladen, um CVar<T> in T casten zu können (und umgekehrt, aber das geht ja einfach über den c'tor), also z.B.:

    CVar<int> a = 5;
    int b = a;
    

    Ich hab jetzt sowas probiert:

    template<class T>
    T operator=(const CVar &o)
    {
      return o.m_Value;
    }
    

    Das will aber leider nicht... Wahrscheinlich isses einfach zu spät und deshalb seh ich den Fehler nicht... Kann einer helfen?

    thx,
    fallen



  • probier das:

    std::ostream& operator=(std::ostream& os, CVar &o)
    


  • template<class T> 
    class CVar 
    { 
    	typedef CVar<T> This;
    public:
    	CVar(T val)
    		:	m_Value(m_Value)
    	{
    	}
    
    	template<typename U>
    	This &operator=(U val)
    	{
    		m_Value = val;
    	}
    
    	operator T&()
    	{
    		return m_Value;
    	}
    
    	operator const T&() const
    	{
    		return m_Value;
    	}
    
    private:
    	T m_Value;   
    };
    


  • ssm schrieb:

    template<class T> 
    class CVar 
    { 
    	typedef CVar<T> This;
    public:
    	CVar(T val)
    		:	m_Value(m_Value)     //muss heißen: m_Value(val)
    	{
    	}
    
    	template<typename U>
    	This &operator=(U val)      //muss nicht einfach nur T& zurückgegeben werden?
    	{
    		m_Value = val; 
    	}
    
    	operator T&()
    	{
    		return m_Value;
    	}
    
    	operator const T&() const
    	{
    		return m_Value;
    	}
    
    private:
    	T m_Value;   
    };
    


  • leech schrieb:

    //muss heißen: m_Value(val)

    ja

    leech schrieb:

    //muss nicht einfach nur T& zurückgegeben werden?

    nein



  • Danke, funktioniert. 🙂



  • leech schrieb:

    ssm schrieb:

    This &operator=(U val)      //muss nicht einfach nur T& zurückgegeben werden?
    

    Wie schon gesagt, nein. Der Umweg über This mit

    typedef CVar<T> This;
    

    ist allerdings redundant, da 'CVar' innerhalb der Klassendefinition implizit immer 'CVar<T>' ist. Ein simples

    template<typename U>
    CVar& operator=(U val)
    

    reicht auch, wobei ich dann doch eher

    template<typename U>
    CVar& operator =(const U& val)
    

    schreiben würde.

    edit:
    Hoffe jetzt siehts besser aus. 😃



  • geiler bug im forum



  • groovemaster schrieb:

    Hoffe jetzt siehts besser aus. 😃

    es kann noch besser mit boost::call_traits aussehen :p


Anmelden zum Antworten