C ++, матричные операции, проблема с операторами - PullRequest
0 голосов
/ 25 апреля 2011

В моем классе есть часть для матричных операций:

class Matrix
{
private:
    std::vector < std::vector <T> > items;      
    const unsigned int rows_count;          
    const unsigned int columns_count;       

public:
    Matrix ( unsigned int m_rows, unsigned int m_columns);
    Matrix ( const Matrix <T> &M );

    template <typename U>
    Matrix <T> & operator = ( const Matrix <U> &M );

    template <typename U>
    bool operator == ( const Matrix <U> &M ) const;

    template <typename U>
    bool operator != ( const Matrix <U> &M ) const ;

    template <typename U>
    Matrix <T> operator + ( const Matrix <U> &M ) const
    ...
};

, где

template <typename T>
template <typename U>
Matrix <U> Matrix <T> ::operator + ( const Matrix <U> &M ) const
{
    Matrix <U> C ( M );

    for ( unsigned int i = 0; i < rows_count; i++ )
    {
        for ( unsigned int j = 0; j < M.getColumnsCount(); j++ )
        {
                C ( i, j ) = items[i][j] + M.items[i][j];
        }
    }

    return C;
}

template<class T>
Matrix <T> :: Matrix ( const Matrix <T> &M )
    : rows_count ( M.rows_count ), columns_count ( M.columns_count ), items ( M.items ) {}

Но есть проблема со следующими операторами: =, ==, !=

Я пытаюсь назначить матрицу A

Matrix <double> A (2,2);
Matrix <double> C (2,2);

к матрице B

Matrix <int> B (2,2);

B = A;  //Compiler error, see bellow, please

где A и B имеют разные типы. Та же самая ситуация происходит для общих матричных операций

C = A + B   //Compiler error, see bellow, please

но компилятор показывает эту ошибку:

Error   23  error C2446: '!=' : no conversion from 'const Matrix<T> *' to 'Matrix<T> *const '

Спасибо за вашу помощь ...

Ответы [ 2 ]

1 голос
/ 26 апреля 2011

В коде, который вы представили, есть некоторые ошибки, но вы должны обработать куски кода, которые вы представляете, так как ошибка, по-видимому, указывает на использование operator!=, в то время как код использует operator= и operator+.

Теперь о некоторых конкретных проблемах: вы объявляете определение различных операторов:

template <typename T>
class Matrix {
...
   template <typename U>
   Matrix<T> operator+( Matrix<U> const & ) const; 
   //     ^
};
template <typename T>
template <typename U>
Matrix<U> Matrix<X>::operator+( Matrix<U> const & m ) const
//     ^

Кроме того, как правило, проще определить элементы шаблона внутри объявления класса, как правило. Это на самом деле не связано с проблемой, с которой вы столкнулись, но прежде чем вы действительно сможете найти точную ошибку с указанием строки ошибки и кода (также обратите внимание, что лучше, если вы можете воспроизвести ошибку в строке, которая не используйте больше, чем один из ваших определенных операторов) ... ну, без каких-либо подробностей, я не могу особо помочь.

0 голосов
/ 26 апреля 2011

Как уже отмечали другие, трудно понять, в чем проблема, так как вы не предоставляете реализацию случая, который выдает ошибку '! =', Или '='. Я предполагаю, что проблема возникает из ваших постоянных членов данных. Это может привести к тому, что компилятор интерпретирует все экземпляры вашего класса Matrix как объекты const, что приведет к вашему сообщению об ошибке. Конечно, если ваш оператор присваивания не примет это во внимание, тогда любое присвоение завершится неудачей, хотя такой код, вероятно, не скомпилируется, а ваш скомпилируется.

Итак: достаньте супругов и посмотрите, что получится.

Также

C ( i, j ) = items[i][j] + M.items[i][j]

обязательно должно быть

C.items[i][i] = items[i][j] + M.items[i][j]
...