PDA

Visualizza la versione completa : [C++] Template e funzioni friend


zappeis
03-02-2008, 21:25
ciao ragazzi! avrei un problemino. sto costruendo una classe template matrice.... mi da i seguenti errori e warning.... ma non so il perche... sapete dirmi almeno a cosa sono dovuti?

In file included from ..\Matrix.cpp:1:
..\Matrix.h:45: warning: friend declaration `bool operator==(const
matrix<T>&, const matrix<T>&)' declares a non-template function
..\Matrix.h:45: warning: (if this is not what you intended, make sure
the function template has already been declared and add <> after the
function name here) -Wno-non-template-friend disables this warning
..\Matrix.h:46: warning: friend declaration `bool operator!=(const
matrix<T>&, const matrix<T>&)' declares a non-template function
..\Matrix.h:58: warning: friend declaration `matrix<T> operator+(const
matrix<T>&, const matrix<T>&)' declares a non-template function
..\Matrix.h:59: warning: friend declaration `matrix<T> operator-(const
matrix<T>&, const matrix<T>&)' declares a non-template function
..\Matrix.h:61: warning: friend declaration `matrix<T> operator*(const
matrix<T>&, const matrix<T>&)' declares a non-template function
..\Matrix.h:62: warning: friend declaration `matrix<T> operator*(const
matrix<T>&, const T&)' declares a non-template function
..\Matrix.h:64: warning: friend declaration `matrix<T> operator^(const
matrix<T>&, const NEWINT&)' declares a non-template function
..\Matrix.h:66: warning: friend declaration `std::istream&
operator>>(std::istream&, matrix<T>&)' declares a non-template function
..\Matrix.h:67: warning: friend declaration `std::ostream&
operator<<(std::ostream&, matrix<T>&)' declares a non-template function
..\Matrix.h:210: error: `bool matrix<T>::operator==(const matrix<T>&,
const matrix<T>&)' must take exactly one argument
..\Matrix.h:210: error: no `bool matrix<T>::operator==(const
matrix<T>&, const matrix<T>&)' member function declared in class `matrix<T>'
..\Matrix.h:210: error: template definition of non-template `bool
matrix<T>::operator==(const matrix<T>&, const matrix<T>&)'

Matrice.exe - 3 error(s), 11 warning(s)

grazie in anticipo!

oregon
03-02-2008, 22:35
Magari, se facessi vedere il codice ...

zappeis
04-02-2008, 11:32
riga 45
friend bool operator == (const Matrix& m1, const Matrix& m2); //dichiarazione

riga 46
friend bool operator != (const Matrix& m1, const Matrix& m2); //dichiarazione

riga 58
friend Matrix operator + (const Matrix& m1, const Matrix& m2); //

riga 210
MAT_TEMPLATE inline bool
Matrix::operator == (const Matrix& m1, const Matrix& m2)
{
bool retVal = false;

if (m1.Rig != m2.Rig || m1.Col != m2.Col)
return retVal;

for (NEWINT i=0; i < m1.Row; i++)
for (NEWINT j=0; j < m1.Col; i++)
if (m1.Val[i][j] != m2.Val[i][j])
return retVal;

return true;
}

praticamente mi da i warning sulle friend e gli errori su questo template....

ringrazio di nuovo

MacApp
04-02-2008, 12:03
Originariamente inviato da zappeis
riga 45
friend bool operator == (const Matrix& m1, const Matrix& m2); //dichiarazione

riga 46
friend bool operator != (const Matrix& m1, const Matrix& m2); //dichiarazione

riga 58
friend Matrix operator + (const Matrix& m1, const Matrix& m2); //

riga 210
MAT_TEMPLATE inline bool
Matrix::operator == (const Matrix& m1, const Matrix& m2)
{
bool retVal = false;

if (m1.Rig != m2.Rig || m1.Col != m2.Col)
return retVal;

for (NEWINT i=0; i < m1.Row; i++)
for (NEWINT j=0; j < m1.Col; i++)
if (m1.Val[i][j] != m2.Val[i][j])
return retVal;

return true;
}

praticamente mi da i warning sulle friend e gli errori su questo template....

ringrazio di nuovo

Difficile diagnosticare il problema: che cos'e' MAT_TEMPLATE?
Provando ad indovinare che sia un qualcosa di simile a:


template <typename T>


allora come minimo devi scrivere un qualcosa del genere:


template <typename T>
bool
Matrix <T>::operator ==

zappeis
04-02-2008, 12:41
grazie per la risposta...
all'inizio del file header avevo scritto

#if !defined(_NO_TEMPLATE)
# define MAT_TEMPLATE template <class T>
# define Matrix matrix<T>
#else
# define MAT_TEMPLATE
# define Matrix matrix
# ifdef MATRIX_TYPE
typedef MATRIX_TYPE T;
# else
typedef double T;
# endif
#endif

grazie ancora :)

zappeis
04-02-2008, 18:27
risolto... praticamente mi ero dichiarato delle funzioni template friend quando non dovevo dichiararle ma solamente implementarle....

grazie

Loading