[C++] Szablony klas

Odpowiedz Nowy wątek
2011-11-17 22:21
photon
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&)|

Pozostało 580 znaków

2011-11-18 10:06
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 { ... }

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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