Матричная операция, проблема конструктора - PullRequest
1 голос
/ 26 апреля 2011

Я хотел бы задать еще один вопрос о матричных операциях ...

template <typename T>
struct TMatrix
{
    typedef std::vector < std::vector <T> > Type;
};


template <typename T>
class Matrix
{
    private:
            typename TMatrix <T>::Type items;       
            const unsigned int rows_count;          
            const unsigned int columns_count;   

    public:
             template <typename U>
             //Error, see bellow please
             Matrix ( const Matrix <U> &M ): 
                  rows_count ( M.getRowsCount() ), columns_count ( M.getColumnsCount() ), items ( M.getItems()){} 
             unsigned int getRowsCount() const {return rows_count;}
             unsigned int getColumnsCount() const {return columns_count;}
             typename TMatrix <T>::Type const & getItems () const {return items;}
             typename TMatrix <T>::Type & getItems ()  {return items;}  

Компилируя код, компилятор останавливается здесь:

Matrix ( const Matrix <U> &M ):  
      rows_count ( M.getRowsCount() ), columns_count ( M.getColumnsCount() ), items ( M.getItems()){}  //Error

и показывает следующую ошибку:

Error   79  error C2664: 'std::vector<_Ty>::vector(const std::allocator<_Ty> &)' : cannot convert parameter 1 from 'const std::vector<_Ty>' to 'const std::allocator<_Ty> &'

Но я не знаю, почему ... Еще раз спасибо за вашу помощь ...

Обновленный вопрос:

Компиляция кода

template <class T>
template <typename U>
Matrix <T> :: Matrix ( const Matrix <U> &M )
: rows_count ( M.getRowsCount() ), columns_count ( M.getColumnsCount() ), items ( M.getItems().begin(), M.getItems().end()){}

со следующим результатом:

Error   132 error C2664: 'std::vector<_Ty>::vector(const std::allocator<_Ty> &)' : 
cannot convert parameter 1 from 'const std::vector<_Ty>' to 'const std::allocator<_Ty> &'
c:\program files\microsoft visual studio 10.0\vc\include\xmemory    208

Ответы [ 2 ]

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

Ваш шаблонный конструктор Matrix<T>::Matrix<U>(const Matrix<U> &M) предназначен для построения Matrix<T> с учетом Matrix<U>.Это делается путем вызова конструктора vector<vector<T>>(vector<vector<U>>) в списке инициализаторов.

Проблема в том, что std::vector не предоставляет конструктор смешанного типа.

Я не знаю, какрешить это в списке инициализатора.Вы можете сделать это в теле конструктора.Вот обновления вашего общедоступного интерфейса, позволяющие это:

Matrix() : rows_count(), columns_count(), items() {}
template <typename U>
Matrix ( const Matrix <U> M ):
    rows_count ( M.getRowsCount() ), columns_count ( M.getColumnsCount() ), items ( ) {
    for(int i = 0; i < M.getItems().size(); i++) {
        items.push_back(std::vector<T>(M.getItems()[i].begin(),M.getItems()[i].end()));
    }
}
0 голосов
/ 26 апреля 2011

Вы забыли #include <vector> вверху и }; в конце файла.Когда я добавляю их в код, он прекрасно компилируется на моем компьютере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...