Problema template class

di il
12 risposte

Problema template class

Non capisco cosa non vada nel mio codice per una classe templato che processi le matrici

Questo è il mio codice matrixType.h
#ifndef MATRIXTYPE_H
#define MATRIXTYPE_H

#include <iostream>
#include <cassert>
#include <iomanip>


using namespace std;

template<class elemType>
class matrixType
{
    template<class elemType>
    friend ostream& operator<<(ostream& osObject, const matrixType<elemType>& matr);

    public:
        matrixType(int rows=3, int columns=3);
        ~matrixType();
        matrixType<elemType> operator+(const matrixType<elemType>&) const;
        matrixType<elemType> operator-(const matrixType<elemType>&) const;
        matrixType<elemType> operator*(const matrixType<elemType>&) const;
        elemType& operator()(int rows, int columns);
        const elemType& operator()(int rows, int columns) const;
    protected:
    private:
        elemType *mat;
        int row;
        int col;
};

template<class elemType>
matrixType<elemType>::matrixType(int rows, int columns)
{
    row = rows;
    col = columns;

    mat = new elemType [row*col];
}

template<class elemType>
matrixType<elemType>::~matrixType()
{
    delete [] mat;
}

template<class elemType>
ostream& operator<<(ostream& osObject, const matrixType<elemType>& matr)
{
    for(int i=0; i<matr.row; i++)
    {
        osObject << "( ";

        for(int j=0; j<matr.col; j++)
            osObject << setw(3) << matr(i,j) << " ";

        osObject << ")" << endl;
    }

    return osObject;
}

template<class elemType>
matrixType<elemType> matrixType<elemType>::operator+(const matrixType<elemType>& othermat) const
{
    matrixType<elemType> temp;

    assert(row==othermat.row && col==othermat.col);
    temp.row = row;
    temp.col = col;
    for(int i=0; i<row; i++)
        for(int j=0; j<col; j++)
            temp(i,j) = mat[col*i+j]+othermat(i,j);

    return temp;
}

template<class elemType>
matrixType<elemType> matrixType<elemType>::operator-(const matrixType<elemType>& othermat) const
{
    matrixType<elemType> temp;

    assert(row==othermat.row && col==othermat.col);
    temp.row = row;
    temp.col = col;
    for(int i=0; i<row; i++)
        for(int j=0; j<col; j++)
            temp(i,j) = mat[col*i+j]-othermat(i,j);

    return temp;
}

template<class elemType>
matrixType<elemType> matrixType<elemType>::operator*(const matrixType<elemType>& othermat) const
{
    matrixType<elemType> temp;

    assert(col==othermat.row);
    temp.row = row;
    temp.col = othermat.col;

    for(int i=0; i<row; i++)
        for(int j=0; j<temp.col; j++)
            temp(i,j) = 0;

    for(int i=0; i<row; i++)
        for(int j=0; j<temp.col; j++)
            for(int z=0; z<col; z++)
                temp(i,j) += mat[col*i+z]*othermat(z,j);

    return temp;
}

template<class elemType>
elemType& matrixType<elemType>::operator()(int rows, int columns)
{
    return mat[col*rows+columns];
}

template<class elemType>
const elemType& matrixType<elemType>::operator()(int rows, int columns) const
{
    return mat[col*rows+columns];
}

#endif // MATRIXTYPE_H
E questo il main
#include <iostream>
#include "matrixType.h"

using namespace std;

int main()
{
    matrixType<int> mat1(2,3),mat2;

    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++)
        {
            mat1(i,j) = 0;
            mat2(i,j) = 0;
        }


    mat1(1,1) = 9;
    mat2(0,2) = 3;

    cout << mat1 << endl;
    cout << mat2 << endl;
    cout << mat1*mat2;

    return 0;
}
Il compilatore mi dà l'errore
||=== matrix, Release ===|
D:\programmic++\matrix\matrixType.h|14|error: declaration of 'class elemType'|
D:\programmic++\matrix\matrixType.h|11|error: shadows template parm 'class elemType'|
||=== Build finished: 2 errors, 0 warnings (0 minutes, 0 seconds) ===|

12 Risposte

  • Re: Problema template class

    Così su due piedi mi pare che la dichiarazione della funzione friend sia incompleta.
    Dovrebbe essere:
    
    // forward declaration
    template<class elemType>
    class matrixType;
    
    // forward declaration
    template<class elemType>
    ostream& operator<<(ostream& osObject, const matrixType<elemType>& matr);
    
    // il resto non cambia.
    
    Dopo di che, in vista di un uso della classe in più unità di compilazione, è meglio togliere quello:
    using namespace std;
    e mettere tutte le funzioni definite fuori dalla classe: inline.
  • Re: Problema template class

    Perdona l'ignoranza però: che intendi per forward declaration e cos'è inline?

    Inoltre, il tuo consiglio è quindi di levare la notazione "friend"?
  • Re: Problema template class

    Una forward declaration è una dichiarazione anticipata e incompleta di una classe /struttura che serve al compilatore per verificare la correttezza di una successiva dichiarazione.
    Nel caso in esame la forward declaration della classe serve per il prototipo della funzione operator << immediatamente successiva, in quanto tale funzione ha un parametro di matrixType.

    Il prototipo della funzione operator << serve al compilatore perché all'interno della dichiarazione della classe la funzione è friend.
    Tali contorsionismi sono (purtroppo) necessari perché stai usando un template e non sviluppi la funzione friend all'interno della classe.

    Se tu avessi scritto:
    
    class matrixType
    {
        template<class elemType>
        friend ostream& operator<<(ostream& osObject, const matrixType<elemType>& matr) {
            for(int i=0; i<matr.row; i++)
            {
                osObject << "( ";
    
                for(int j=0; j<matr.col; j++)
                      osObject << setw(3) << matr(i,j) << " ";
    
                    osObject << ")" << endl;
            }
    
            return osObject;
        }
    // il resto uguale
    
    non avresti avuto il problema iniziale.

    inline è necessario in quanto il file "matrixType.h" è plausibile che venga utilizzato in più unità di compilazione. In tal caso senza lo specificatore inline, nelle funzioni definite fuori dal corpo della classe, si viola il principio della one definition rule, il linker si troverebbe definizioni identiche in più di una unità di compilazione e darebbe errore di simbolo multiplo.
    Per evitarlo basta fare (ad esempio):
    
    template<class elemType>
    inline matrixType<elemType>::matrixType(int rows, int columns)
    {
        row = rows;
        col = columns;
    
        mat = new elemType [row*col];
    }
    
    per ogni funzione non direttamente definita nel corpo della classe (in pratica tutte quelle che hai scritto).
  • Re: Problema template class

    Ho inserito l'implementazione della friend function nella classe ma mi dà ancora errore
    #define MATRIXTYPE_H
    
    #include <iostream>
    #include <cassert>
    #include <iomanip>
    
    
    template<class elemType>
    class matrixType
    {
        template<class elemType>
        friend ostream& operator<<(ostream& osObject, const matrixType<elemType>& matr)
        {
            for(int i=0; i<matr.row; i++)
            {
                osObject << "( ";
    
                for(int j=0; j<matr.col; j++)
                    osObject << setw(3) << matr(i,j) << " ";
    
                osObject << ")" << endl;
            }
    
            return osObject;
        }
    
        public:
            matrixType(int rows=3, int columns=3);
            ~matrixType();
            matrixType<elemType> operator+(const matrixType<elemType>&) const;
            matrixType<elemType> operator-(const matrixType<elemType>&) const;
            matrixType<elemType> operator*(const matrixType<elemType>&) const;
            elemType& operator()(int rows, int columns);
            const elemType& operator()(int rows, int columns) const;
        protected:
        private:
            elemType *mat;
            int row;
            int col;
    };
    
    template<class elemType>
    matrixType<elemType>::matrixType(int rows, int columns)
    {
        row = rows;
        col = columns;
    
        mat = new elemType [row*col];
    }
    
    template<class elemType>
    matrixType<elemType>::~matrixType()
    {
        delete [] mat;
    }
    
    template<class elemType>
    ostream& operator<<(ostream& osObject, const matrixType<elemType>& matr)
    {
        for(int i=0; i<matr.row; i++)
        {
            osObject << "( ";
    
            for(int j=0; j<matr.col; j++)
                osObject << setw(3) << matr(i,j) << " ";
    
            osObject << ")" << endl;
        }
    
        return osObject;
    }
    
    template<class elemType>
    matrixType<elemType> matrixType<elemType>::operator+(const matrixType<elemType>& othermat) const
    {
        matrixType<elemType> temp;
    
        assert(row==othermat.row && col==othermat.col);
        temp.row = row;
        temp.col = col;
        for(int i=0; i<row; i++)
            for(int j=0; j<col; j++)
                temp(i,j) = mat[col*i+j]+othermat(i,j);
    
        return temp;
    }
    
    template<class elemType>
    matrixType<elemType> matrixType<elemType>::operator-(const matrixType<elemType>& othermat) const
    {
        matrixType<elemType> temp;
    
        assert(row==othermat.row && col==othermat.col);
        temp.row = row;
        temp.col = col;
        for(int i=0; i<row; i++)
            for(int j=0; j<col; j++)
                temp(i,j) = mat[col*i+j]-othermat(i,j);
    
        return temp;
    }
    
    template<class elemType>
    matrixType<elemType> matrixType<elemType>::operator*(const matrixType<elemType>& othermat) const
    {
        matrixType<elemType> temp;
    
        assert(col==othermat.row);
        temp.row = row;
        temp.col = othermat.col;
    
        for(int i=0; i<row; i++)
            for(int j=0; j<temp.col; j++)
                temp(i,j) = 0;
    
        for(int i=0; i<row; i++)
            for(int j=0; j<temp.col; j++)
                for(int z=0; z<col; z++)
                    temp(i,j) += mat[col*i+z]*othermat(z,j);
    
        return temp;
    }
    
    template<class elemType>
    elemType& matrixType<elemType>::operator()(int rows, int columns)
    {
        return mat[col*rows+columns];
    }
    
    template<class elemType>
    const elemType& matrixType<elemType>::operator()(int rows, int columns) const
    {
        return mat[col*rows+columns];
    }
    
    #endif // MATRIXTYPE_H
    La questione dell'inline non viene risolta automaticamente con #ifndef .. ...?
  • Re: Problema template class

    Perché non hai tolto la funzione esterna alla classe (quella che hai definito tra il costruttore e operator + ).
    Ci sono comunque altri errori, ma quelli li scopri a run time.

    No. Non basta la include guard: le funzioni negli header file vanno dichiarate inline.

    Che compilatore usi?
  • Re: Problema template class

    Uso MinGW e in effetti sono riuscito a compilarlo ma proprio come hai predetto in run time mi va in crash. Fa esattamente quello che deve fare, stampa a video la matrice prodotto ma lì qualcosa gli crea problemi.

    Edit: mi sono accorto che a volte termina con return 0 e altre volte crasha o_O
  • Re: Problema template class

    E' semplice pronosticare un crash quando una classe che maneggia un puntatore non prevede ne costruttore di copia ne operatore di assegnamento, cose che la tua classe non ha.
    Se la versione che hai di minGW è abbastanza recente ( > 4.3 ) è possibile anche inserire il costruttore di spostamento e l'operatore di spostamento.
    Ma mentre i primi due sono da sempre nel linguaggio, gli ultimi due sono stati introdotti recentemente. Verifica che versione di compilatore hai e intanto implementa i primi due.
  • Re: Problema template class

    Dovrei avere la 4.7. Ho implementato copy constructor e operatore di assegnamento ma qualche volte continua ad andare in crash
    #ifndef MATRIXTYPE_H
    #define MATRIXTYPE_H
    
    #include <iostream>
    #include <cassert>
    #include <iomanip>
    
    
    template<class elemType>
    class matrixType
    {
        template<class eleType>
        friend std::ostream& operator<<(std::ostream& osObject, const matrixType<eleType>& matr);
    
        public:
            matrixType(int rows=3, int columns=3);
            matrixType(const matrixType<elemType>&);   // copy costr
            ~matrixType();
            matrixType<elemType> operator+(const matrixType<elemType>&) const;
            matrixType<elemType> operator-(const matrixType<elemType>&) const;
            matrixType<elemType> operator*(const matrixType<elemType>&) const;
            const matrixType<elemType>& operator=(const matrixType<elemType>&);
            elemType& operator()(int rows, int columns);
            const elemType& operator()(int rows, int columns) const;
        protected:
        private:
            elemType *mat;
            int row;
            int col;
    };
    
    template<class elemType>
    matrixType<elemType>::matrixType(int rows, int columns)
    {
        row = rows;
        col = columns;
    
        mat = new elemType [row*col];
    }
    
    template<class elemType>
    matrixType<elemType>::matrixType(const matrixType<elemType>& othermat)
    {
        row = othermat.row;
        col = othermat.col;
    
        mat = new elemType [row*col];
    
        for(int i=0; i<row; i++)
            for(int j=0; j<col; j++)
                (*this)(i,j) = othermat(i,j);
    }
    
    template<class elemType>
    matrixType<elemType>::~matrixType()
    {
        delete [] mat;
    }
    
    template<class elemType>
    std::ostream& operator<<(std::ostream& osObject, const matrixType<elemType>& matr)
    {
        for(int i=0; i<matr.row; i++)
        {
            osObject << "( ";
    
            for(int j=0; j<matr.col; j++)
                osObject << std::setw(3) << matr(i,j) << " ";
    
            osObject << ")" << std::endl;
        }
    
        return osObject;
    }
    
    template<class elemType>
    matrixType<elemType> matrixType<elemType>::operator+(const matrixType<elemType>& othermat) const
    {
        matrixType<elemType> temp;
    
        assert(row==othermat.row && col==othermat.col);
        temp.row = row;
        temp.col = col;
        for(int i=0; i<row; i++)
            for(int j=0; j<col; j++)
                temp(i,j) = mat[col*i+j]+othermat(i,j);
    
        return temp;
    }
    
    template<class elemType>
    matrixType<elemType> matrixType<elemType>::operator-(const matrixType<elemType>& othermat) const
    {
        matrixType<elemType> temp;
    
        assert(row==othermat.row && col==othermat.col);
        temp.row = row;
        temp.col = col;
        for(int i=0; i<row; i++)
            for(int j=0; j<col; j++)
                temp(i,j) = mat[col*i+j]-othermat(i,j);
    
        return temp;
    }
    
    template<class elemType>
    matrixType<elemType> matrixType<elemType>::operator*(const matrixType<elemType>& othermat) const
    {
        matrixType<elemType> temp;
    
        assert(col==othermat.row);
        temp.row = row;
        temp.col = othermat.col;
    
        for(int i=0; i<row; i++)
            for(int j=0; j<temp.col; j++)
                temp(i,j) = 0;
    
        for(int i=0; i<row; i++)
            for(int j=0; j<temp.col; j++)
                for(int z=0; z<col; z++)
                    temp(i,j) += mat[col*i+z]*othermat(z,j);
    
        return temp;
    }
    
    template <class elemType>
    const matrixType<elemType>& matrixType<elemType>::operator=(const matrixType<elemType>& othermat)
    {
        if(this != &othermat)
        {
            row = othermat.row;
            col = othermat.col;
    
            mat = new elemType [row*col];
    
            for(int i=0; i<row; i++)
                for(int j=0; j<col; j++)
                    *this(i,j) = othermat(i,j);
        }
    
        return *this;
    }
    
    template<class elemType>
    elemType& matrixType<elemType>::operator()(int rows, int columns)
    {
        return mat[col*rows+columns];
    }
    
    template<class elemType>
    const elemType& matrixType<elemType>::operator()(int rows, int columns) const
    {
        return mat[col*rows+columns];
    }
    
    #endif // MATRIXTYPE_H
    
  • Re: Problema template class

    1) Intanto osserva queste righe del main:
    
        matrixType<int> mat1(2,3),mat2;
    
        for(int i=0; i<3; i++)
            for(int j=0; j<3; j++)
            {
                mat1(i,j) = 0;
                mat2(i,j) = 0;
            }
    
    mat1 ha dimensione 2 x 3, mat2 (visto che usi parametri di default, a mio avviso una pessima idea) ha dimensione 3 x 3. I cicli for iterano per 9 volte in totale quindi sforano la dimensione di mat1 con crash randomici. Già questo è un errore.

    2) Non capisco perché il costruttore di default abbia valori di default row = 3, col = 3: una matrice 2 x 2 o 3 x 17 non ha pari dignità forse? Ma soprattutto è una cosa inutile perché se mat2 la usi come risultato di un assegnamento:
    a) allochi la memoria per niente
    b) perdi il riferimento a tale zona di memoria.
    Più sensato sarebbe che il costruttore di default imposti a 0 sia row sia col e a nullptr (visto che usi la versione 4.7 inizia a vedere i costrutti C++11) il puntatore mat.
    Per ridimensionare la matrice sarà sufficiente un metodo resize(row,col) per la costruzione a posteriori della matrice.

    3) Costruttore copia e operatore assegnamento.
    Dato che utilizzi un array per simulare la matrice medianto calcolo di indici (la cosa più efficiente per una classe matrice), il doppio for si può evitare copiando i due array come se fossero array, appunto. Dato che la classe è un template (e che quindi può essere istanziata anche con classi) la cosa migliore da fare è usare std::copy
    
    std::copy(othermat.mat, othermat.mat + ( row * col ), mat);
    
    sarà poi il compilatore a richiamare una eventuale memcpy per i tipi base (i POD).

    4) L'implementazione degli operatori è sbagliata.
    
    template<class elemType>
    matrixType<elemType> matrixType<elemType>::operator+(const matrixType<elemType>& othermat) const
    {
        matrixType<elemType> temp;
    
        assert(row==othermat.row && col==othermat.col);
        temp.row = row;
        temp.col = col;
    
    Dichiari una matrice temp (per default 3 x 3), fai gli opportuni controlli su row e col e poi assegni tali valori a temp col rischio di falsare i valori interni e il range massimo di temp.mat.
    Corretto è:
    
        assert(row==othermat.row && col==othermat.col);
        matrixType<elemType> temp(row,col);
        for(int i=0; i<row; i++)
            for(int j=0; j<col; j++)
                temp(i,j) = mat[col*i+j]+othermat(i,j);
    
        return temp;
    
    In questo modo prima controlli che i vincoli siano rispettati e poi ti costruisci la matrice con i valori corretti. Vale anche per gli altri operatori ovviamente.

    5) operatore di assegnamento.
    A differenza del costruttore di copia, l'operatore di assegnamento lavora su un oggetto fatto e finito. La tua implementazione è quasi corretta perché non tiene conto del fatto che hai già un this->mat allocato. In definitiva hai un memory leak.
    Corretto è:
    
        if(this != &othermat)
        {
            row = othermat.row;
            col = othermat.col;
    
            // new potenzialmente lancia un'eccezione.
           
            elementType* tmp = new elemType [row*col];
            std::copy(othermat.mat, othermat.mat + ( row * col ), tmp);
            delete[] mat;
            mat = tmp;
        }
        return *this;
    
    Il perché lo puoi trovare qui al paragrafo "Eccezioni e self assigment":
    http://www.eptacom.net/pubblicazioni/pub_it/ptt.htm

    6) Costruttore di spostamento e operatore di spostamento.
    Per ovviare all'inconveniente di produrre copie temporanee, il C++11 ha introdotto la move semantics. Questo si traduce nell'implementazione dei costrutti al punto 6.
    Te li scrivo qui:
    
    template<class elemType>
    matrixType<elemType>::matrixType(matrixType<elemType>&& othermat) :
        row(othermat.row), col(othermat.row), mat(othermat.mat)
    {
        othermat.row = 0;
        othermat.col = 0;
        mat = nullptr;
    }
    
    template <class elemType>
    matrixType<elemType>& matrixType<elemType>::operator=(matrixType<elemType>&& othermat)
    {
        if(this != &othermat)
        {
            row = othermat.row;
            col = othermat.col;
            mat = othermat.mat;
    
            othermat.row=0;
            othermat.col=0;
            othermat.mat=nullptr;
          }
          return *this;
    }
    
    Nota che in questo caso, non viene copiato mat, ma viene "rubato" a othermat. Il che si traduce in un aumento delle prestazioni. Il compilatore (automaticamente) userà questi costrutti durante le restituzioni di matrici dopo le varie operazioni.
    (Ad esempio prova a scrivere una funzione che accetti una matrice per copia e vedi che succede col debugger).
  • Re: Problema template class

    In definitiva la tua classe dovrebbe assomigliare a:
    
    #include <iostream>
    #include <cassert>
    #include <iomanip>
    #include <algorithm>
    
    template<class elemType>
    class matrixType
    {
        template<class eleType>
    	friend std::ostream& operator<<(std::ostream& osObject, const matrixType<eleType>& matr) {
    		for(int i=0; i<matr.row; i++)
    		{
    			osObject << "( ";
    
    			for(int j=0; j<matr.col; j++)
    				osObject << std::setw(3) << matr(i,j) << " ";
    
    			osObject << ")" << std::endl;
    		}
    
    		return osObject;	
    	}
    
        public:
            matrixType();
            matrixType(int rows, int columns);
            matrixType(const matrixType<elemType>&);   // copy costr
            matrixType(matrixType<elemType>&&);   // move costr
    
            ~matrixType();
            matrixType<elemType> operator+(const matrixType<elemType>&) const;
            matrixType<elemType> operator-(const matrixType<elemType>&) const;
            matrixType<elemType> operator*(const matrixType<elemType>&) const;
            matrixType<elemType>& operator=(const matrixType<elemType>&);
            matrixType<elemType>& operator=(matrixType<elemType>&&);
    	void resize(int rows, int columns);
    	elemType& operator()(int rows, int columns);
            const elemType& operator()(int rows, int columns) const;
        protected:
        private:
            elemType *mat;
            int row;
            int col;
    };
    
    template<class elemType>
    matrixType<elemType>::matrixType() : row(0), col(0), mat(nullptr)
    {
    }
    
    
    template<class elemType>
    matrixType<elemType>::matrixType(int rows, int columns) : mat(nullptr)
    {
    	resize(rows,columns);
    }
    
    template<class elemType>
    matrixType<elemType>::matrixType(const matrixType<elemType>& othermat) : mat(nullptr)
    {
    	resize(othermat.row,othermat.col);
    	std::copy(othermat.mat, othermat.mat + ( row * col ), mat);
    }
    
    template<class elemType>
    matrixType<elemType>::matrixType(matrixType<elemType>&& othermat) : 
    	row(othermat.row), col(othermat.col), mat(othermat.mat)
    {
        othermat.row=0;
        othermat.col=0;
        othermat.mat=nullptr;
    }
    
    template<class elemType>
    matrixType<elemType>::~matrixType()
    {
        delete [] mat;
    }
    
    
    template<class elemType>
    matrixType<elemType> matrixType<elemType>::operator+(const matrixType<elemType>& othermat) const
    {
        assert(row==othermat.row && col==othermat.col);
        matrixType<elemType> temp(row,col);
        for(int i=0; i<row; i++)
            for(int j=0; j<col; j++)
                temp(i,j) = mat[col*i+j]+othermat(i,j);
    
        return temp;
    }
    
    template<class elemType>
    matrixType<elemType> matrixType<elemType>::operator-(const matrixType<elemType>& othermat) const
    {
        assert(row==othermat.row && col==othermat.col);
        matrixType<elemType> temp(row,col);
        for(int i=0; i<row; i++)
            for(int j=0; j<col; j++)
                temp(i,j) = mat[col*i+j]-othermat(i,j);
    
        return temp;
    }
    
    template<class elemType>
    matrixType<elemType> matrixType<elemType>::operator*(const matrixType<elemType>& othermat) const
    {
    
        assert(col==othermat.row);
        matrixType<elemType> temp(row,othermat.col);
    
        for(int i=0; i<row; i++)
            for(int j=0; j<temp.col; j++)
                temp(i,j) = 0;
    
        for(int i=0; i<row; i++)
            for(int j=0; j<temp.col; j++)
                for(int z=0; z<col; z++)
                    temp(i,j) += mat[col*i+z]*othermat(z,j);
    
        return temp;
    }
    
    template <class elemType>
    matrixType<elemType>& matrixType<elemType>::operator=(const matrixType<elemType>& othermat)
    {
        if(this != &othermat)
        {
            resize(othermat.row,othermat.col);
    		std::copy(othermat.mat, othermat.mat + ( row * col ), mat);
        }
        return *this;
    }
    
    template <class elemType>
    matrixType<elemType>& matrixType<elemType>::operator=(matrixType<elemType>&& othermat)
    {
        if(this != &othermat)
        {
    		row = othermat.row;
    		col = othermat.col;
    		mat = othermat.mat;
    
    		othermat.row=0;
    		othermat.col=0;
    		othermat.mat=nullptr;    
    	}
        return *this;
    }
    
    
    template<class elemType>
    void matrixType<elemType>::resize(int rows, int columns)
    {
        delete[] mat;
    	row = rows;
    	col = columns;
    	mat = new elemType [row*col];
    }
    
    template<class elemType>
    elemType& matrixType<elemType>::operator()(int rows, int columns)
    {
        return mat[col*rows+columns];
    }
    
    template<class elemType>
    const elemType& matrixType<elemType>::operator()(int rows, int columns) const
    {
        return mat[col*rows+columns];
    }
    
  • Re: Problema template class

    Non so come ringraziarti, sei stato genitilissimo, adesso la classe funziona alla perfezione, l'unica cosa è il punto 6 che ancora non ho implementato per il semplice fatto che nonostante utilizzi la 4.7 e che il mio IDE (Code::blocks 12.11) supporti il C++11 (almeno in teoria) quando feci un test sulla funzione std::stod e il compilatore non me la riconosceva quindi suppongo non gli piaccia lo standard c++11. Ma va benissimo lo stesso!
  • Re: Problema template class

    Un conto è la funzione std::stod() che fa parte della libreria standard, un conto è la move semantics che fa parte del kernel del linguaggio. Direi che per il punto 6 puoi andare tranquillo.

    Occhio che è il compilatore a supportare il C++11 non l'IDE
Devi accedere o registrarti per scrivere nel forum
12 risposte