Definition kann keinen (mehreren) Deklarationen zugeordnet werden



  • Die Fehlermeldung sagt ja eigentlich schon alles, aber ich verstehe nicht, wieso der Compiler das in meinem Fall nicht kann:

    matrix**.h**

    namespace my {
    
    template <typename ValueType>
    class TLine
    {
    public:
    	typedef size_t		SizeType;
    private:
    	struct _m
    	{
    		SizeType row_count;
    		ValueType *values;
    	};
    
    	_m m;
    public:
    	TLine() throw();
    	TLine(SizeType row_count);
    	TLine(SizeType row_count, ValueType fill_with);
    	TLine(SizeType row_count, const ValueType *fill_with);
    
    	template <typename ValueType_rhs>
    	TLine (const typename TLine <ValueType_rhs> &rhs);
    };
    
    }
    #include "matrix.impl"
    

    matrix**.impl**

    namespace my {
    
    template <typename ValueType, typename ValueType_rhs>
    TLine <ValueType>::TLine(const typename TLine <ValueType_rhs> &rhs)
    	:	m(rhs.m)
    {
    	InitArray(rhs.m.values);
    }
    
    }
    

    Die vollständige Fehlermeldung:

    1>f:\c\libs\math\matrix.impl(25) : error C2244: 'my::TLine<ValueType>::{ctor}' : unable to match function definition to an existing declaration
    1>        definition
    1>        'my::TLine<ValueType>::TLine(const my::TLine<ValueType_rhs> &)'
    1>        existing declarations
    1>        'my::TLine<ValueType>::TLine(const my::TLine<ValueType_rhs> &)'
    1>        'my::TLine<ValueType>::TLine(my::TLine<ValueType>::SizeType,const ValueType *)'
    1>        'my::TLine<ValueType>::TLine(my::TLine<ValueType>::SizeType,ValueType)'
    1>        'my::TLine<ValueType>::TLine(my::TLine<ValueType>::SizeType)'
    1>        'my::TLine<ValueType>::TLine(void) throw()'
    

    Zur Frage an sich: Wie kann ich das verhindern ohne irgendwelche Dummy-Parameter übergeben zu müssen? Liegt es vll daran, dass der Compiler einen eigenen Copy-CTor erzeugt und dieser den Konflikt erzeugt - falls ja, kann ich das umgehen?

    (IDE=VS 2008 Prof.)

    Danke schon mal, bb

    edit: hatte das typedef für sizetype vergessen ^^ + tippfehler + vorschnelle lösung >< ^^



  • Ich denke mal, dass du da nichts gross anderst machen kannst, als die Implementierung in der Klasse zu halten. In dieser Konstelation habe ich das auch noch nie ausserhalb einer Klasse gesehen.



  • drakon schrieb:

    Ich denke mal, dass du da nichts gross anderst machen kannst, als die Implementierung in der Klasse zu halten.

    Jopp - in der Hoffnung, dass er dann in der Anwendung an sich den CTor richtig zuordnen kann... ^^

    drakon schrieb:

    In dieser Konstelation habe ich das auch noch nie ausserhalb einer Klasse gesehen.

    Was meinst du mit dieser Konstellation?

    bb


  • Administrator

    namespace my { 
    
    template<typename ValueType>
    template<typename ValueType_rhs>
    TLine <ValueType>::TLine(const typename TLine <ValueType_rhs> &rhs) 
        :    m(rhs.m) 
    { 
        InitArray(rhs.m.values); 
    } 
    
    }
    

    So sollte das gehen!

    Grüssli



  • Danke 😘

    😉

    Ich wusste doch gleich, warum ich nachfrage statt ewig rumzufummeln ^^ wär ich nicht drauf gekommen, dass er das (wie genau nennt man das eigtl? ^^) einzeln will ^^

    bb


  • Administrator

    Wie man das nennt? Ehm ... glaube ganz einfach "Inner Template". Sobald es einfach einen Templateparameter bei einer Funktion oder Klasse hat, welche sich bereits in einer Klasse mit Templateparameter befindet, muss dies so definiert werden. Deshalb eben auch das "Inner", weil es eben ein Template im Template ist. 😉

    Grüssli


Anmelden zum Antworten