Template-Klasse mit überladenen Operatoren
-
Hallo,
ich bin gerade an deiner Klasse dran die eine Matrix realisiert.
Das Problem bezieht sich auf die Operatoren *, nutzt man diese bekommt man eine Fehlermeldung (siehe "Code"), dass die Operatoren mehrdeutig sind.
Bei den Elementbezogen Operatoren += tritt dieses Problem nicht auf, dort wird zwischen dem Matrix/Matrix und Matrix/Skalar Operator korrekt unterschieden.Hat jemand eine Idee?
Vielen Dank im Voraus...

template<typename TemplateType> class CMatrix { public: … // Elementbezogen void operator*=(CMatrix const& right_mat); void operator*=(TemplateType const& skalar); // Global template<typename TemplateType> friend CMatrix operator*(CMatrix const& left_mat, CMatrix const& right_mat); template<typename TemplateType> friend CMatrix operator*(CMatrix const& left_mat, TemplateType const& skalar); protected: … private: … }; template<typename TemplateType> void CMatrix<TemplateType>::operator*=(CMatrix<TemplateType> const& right_mat) { //... } template<typename TemplateType> void CMatrix<TemplateType>::operator*=(TemplateType const& skalar) { //... } template<typename TemplateType> CMatrix<TemplateType> operator*(CMatrix<TemplateType> const& left_mat, CMatrix<TemplateType> const& right_mat) { //... } template<typename TemplateType> CMatrix<TemplateType> operator*(CMatrix<TemplateType> const& left_mat, TemplateType const& skalar) { //... }IntelliSense: Mehr als ein "*"-Operator stimmt mit diesen Operanden überein: Funktionsvorlage "CMatrix<double> operator*(const CMatrix<double> &left_mat, const TemplateType &skalar)" Funktionsvorlage "CMatrix<TemplateType> operator*(const CMatrix<TemplateType> &left_mat, const CMatrix<TemplateType> &right_mat)" Operandentypen sind: CMatrix<double> * CMatrix<double> d:\Cpp\Projekte\CMatrix\Quelle.cpp 96
-
b3n3 schrieb:
template<typename TemplateType> friend CMatrix operator*(CMatrix const& left_mat, CMatrix const& right_mat); template<typename TemplateType> friend CMatrix operator*(CMatrix const& left_mat, TemplateType const& skalar);->
template<typename TemplateType> friend CMatrix<TemplateType> operator*(CMatrix<TemplateType> const& left_mat, CMatrix<TemplateType> const& right_mat); template<typename TemplateType> friend CMatrix<TemplateType> operator*(CMatrix<TemplateType> const& left_mat, TemplateType const& skalar);Sonst gibt es nämlich folgende Operatoren:
template <typename TemplateType> CMatrix<double> operator*(CMatrix<double> const&, CMatrix<double> const &); (1) template <typename TemplateType> CMatrix<double> operator*(CMatrix<double> const&, TemplateType const &); (2) template<typename TemplateType> CMatrix<TemplateType> operator*(CMatrix<TemplateType> const& left_mat, CMatrix<TemplateType> const& right_mat); (3) template<typename TemplateType> CMatrix<TemplateType> operator*(CMatrix<TemplateType> const& left_mat, TemplateType const& skalar); (4)(1) scheidet direkt aus, weil man dort selber ein Template Argument angeben muss, aber (2) und (3) sind gleichwertig.
BTW: Prefixe deine Klassen nicht mit C.
-
Alles klar, danke!
Hatte verdrängt, dass er bei den friend Operatoren seperate Templates erstellt.
PS: Das C-Präfix ist nicht auf meinem Mist gewachsen, vorgegebene Konvention
