[C++] Szablony klas

0

Witam
Jak powinienem poprawnie zdefiniować własną klasę, aby mogła zostać użyta jako parametr w innej klasie szablonowej?
Konkretniej, mam szablon dla klasy będącej macierzą dowolnych obiektów, i wrzucam do niej własną klasę, klasa ta ma przeładowane operatory dodawania, przypisania, itp.

template <class typ>
Matrix<typ> Matrix<typ>::operator*(Matrix<typ> &macierz1)
{
    	Matrix<typ> macierz(wierszy, macierz1.kolumn);
    	typ** wsk1;
    	typ** wsk2;
    	typ** wsk3;
    	wsk1=macierz.tablica;
    	wsk2=macierz1.tablica;
    	wsk3=tablica;
    	typ wynik;
    	int i;
    	int j;
    	int k;
        
    	for(i=0; i<wierszy; i++)
    	{
			for(j=0; j<macierz1.kolumn; j++)
			{
                                wynik=*(*(tablica+i))*(*(*(macierz1.tablica)+j));
				*(*(macierz.tablica+i)+j)=wynik;
				for(k=1; k<macierz1.wierszy; k++)
				{
					*(*(macierz.tablica+i)+j)=*(*(macierz.tablica+i)+j)+*(*(tablica+i)+k)*    (*(*(macierz1.tablica+k)+j));
				}
			}
    		}
		return macierz;
    	}
} 
Complex Complex::operator+(Complex &liczba1)
{
       Complex wynik;
    wynik.re=liczba1.re+re;
    wynik.im=liczba1.im+im;

    return wynik;
} 
 
void Complex::operator=(Complex &liczba1)
{
    re=liczba1.re;
    im=liczba1.im;

}

Kompilator zwraca dla działań z mnożeniami i równa się

error: no match for ‘operator+’ in ‘(((macierz.Matrix<Complex>::tablica + ((unsigned int)(((unsigned int)i) * 4u)))) + ((unsigned int)(((unsigned int)j) * 8u))) + Complex::operator*(Complex&)(((Complex&)((*(macierz1->Matrix<Complex>::tablica + ((unsigned int)(((unsigned int)k) * 4u)))) + ((unsigned int)(((unsigned int)j) * 8u)))))’|

error: no match for ‘operator+’ in ‘(((macierz.Matrix<Complex>::tablica + ((unsigned int)(((unsigned int)i) * 4u)))) + ((unsigned int)(((unsigned int)j) * 8u))) + Complex::operator*(Complex&)(((Complex&)((*(macierz1->Matrix<Complex>::tablica + ((unsigned int)(((unsigned int)k) * 4u)))) + ((unsigned int)(((unsigned int)j) * 8u)))))’|

note: candidates are: Complex Complex::operator+(Complex&)|

note: candidates are: void Complex::operator=(Complex&)|

0

Fuck, a o operatorach indeksowania słyszał?

for(i = 0; i < wierszy; ++i)
{
	for(j = 0; j < macierz1.kolumn; ++j)
	{
		wsk1[i][j] = wsk3[i][0] * wsk2[0][j];
		
		for(k = 1; k < macierz1.wierszy; ++k)
		{
			wsk1[i][j] = wsk1[i][j] + wsk3[i][k] * wsk2[k][j];
		}
	}
}

Prawda, że czytelniej?

Parametry operatorów powinny być const, tak jak i niektóre metody/operatory:

Complex Complex::operator+(const Complex &liczba1) const { ... }
void Complex::operator=(const Complex &liczba1) { ... }
Matrix<typ> Matrix<typ>::operator*(const Matrix<typ> &macierz1) const { ... }

1 użytkowników online, w tym zalogowanych: 0, gości: 1