Witam wszystkich serdecznie.
Nie wiem czy temat ma poprawne nazewnictwo, z tego względu, że te pojęcia są dla mnie nadal nowością ;) Myślę, że wklejenie części kodu rozwieje wszelkie wątpliwości. Próbowałem wykonać taką karkołomną konstrukcję, jak w temacie i MS Visual Studio niestety nie chce jej przełknąć.
klasa: (Pominąłem, z mojego punktu widzenia, nieistotną dla problemu część kodu)
template <class T>
class macierz
{
friend ostream & ostream::operator<< (ostream & strumien, macierz<T> & M);
friend istream & istream::operator>> (istream & strumien, macierz<T> & M);
T **t;
int w,k;
public:
macierz(int w, int k);
macierz(macierz &w);
macierz();
~macierz();
macierz(const int ** tablica, int wiersze, int kolumny);
macierz<T> & set(int x, int y, T var);
T get(int x, int y);
macierz<T> & wyswietl() const;
macierz operator + (macierz &right);
macierz operator - (const macierz &right);
macierz & operator = (const macierz &kopiowana);
T & operator() (int x, int y);
int getxsize() const;
int getysize() const;
};
i same operatory
template <class T>
ostream & operator << (ostream & strumien, macierz<T> & M)
{
for (int i=0; i<M.getysize(); i++)
{
for (int j=0; j<M.getxsize(); j++)
{
strumien << M.get(i,j) << "\t";
}
strumien << endl;
}
return strumien;
}
template <class T>
istream & operator >> (istream & strumien, macierz<T> & M)
{
T temp;
for (int i=0; i<M.getysize(); i++)
{
for (int j=0; j<M.getxsize(); j++)
{
strumien >> temp;
M.set(i,j,temp);
}
}
return strumien;
}
Jak można się domyślić, metody getysize i getxsize zwracają odpowiednio ilość wierszy i ilość kolumn macierzy (czyli to, do czego chce mieć dostęp poprzez zaprzyjaźnienie operatorów). Metody te zostały stworzone jako rozwiązanie tymczasowe, aby sprawdzić czy przeciążone operatory w ogóle działają. Docelowo metod tych nie ma być. Program kompiluje się pięknie, kiedy nie próbuję zaprzyjaźnić przeciążonych operatorów z klasą, a właściwie jej szablonem.
Visual wypluwa błędy:
Error 1 error C2245: non-existent member function 'std::basic_ostream<_Elem,_Traits>::operator <<' specified as friend (member function signature does not match any overload) d:\studia\po\macierz\macierz\macierz.cpp 9 macierz
Error 2 error C2245: non-existent member function 'std::basic_istream<_Elem,_Traits>::operator >>' specified as friend (member function signature does not match any overload) d:\studia\po\macierz\macierz\macierz.cpp 10 macierz
Error 3 error C2245: non-existent member function 'std::basic_ostream<_Elem,_Traits>::operator <<' specified as friend (member function signature does not match any overload) d:\studia\po\macierz\macierz\macierz.cpp 9 macierz
Error 4 error C2245: non-existent member function 'std::basic_istream<_Elem,_Traits>::operator >>' specified as friend (member function signature does not match any overload) d:\studia\po\macierz\macierz\macierz.cpp 10 macierz
Error 5 error C2245: non-existent member function 'std::basic_ostream<_Elem,_Traits>::operator <<' specified as friend (member function signature does not match any overload) d:\studia\po\macierz\macierz\macierz.cpp 9 macierz
Error 6 error C2245: non-existent member function 'std::basic_istream<_Elem,_Traits>::operator >>' specified as friend (member function signature does not match any overload) d:\studia\po\macierz\macierz\macierz.cpp 10 macierz
Linia 9 i 10 to deklaracje przyjaźni (tutaj też nie wiem czy to dobre określenie) operatorów w klasie macierz.
Da się w ogóle zaprzyjaźnić tak przeciążone operatory z szablonem klasy?