2014-09-08 4 views
1

Серьезно, я посмотрел на подобные примеры, но я до сих пор не понимаю, почему он не работает. У меня возникают проблемы с перегрузкой оператора =.Оператор = перегрузка с помощью шаблонов

Я получаю две следующие ошибки:

  1. ошибка C2955: «Матрица»: использование шаблона класса требует список аргументов шаблона
  2. ошибка C2244: «Матрица оператор :: =»: не может соответствовать функции определение существующей декларации

Может кто-нибудь объяснить, что не так?

Спасибо всем

//Matrix.hpp 

template<typename T> 
class Matrix 
{ 
public: 
    Matrix(int numberRows, int numberColumns); 
    ~Matrix(); 
    void asgValue(T value, int row, int column); 
    T getValue(int row, int column); 
    Matrix<T>& operator= (const Matrix<T>& rhs); 
    friend Matrix<T>& operator+ (const Matrix<T>& lhs, const Matrix<T>& rhs); 
private: 
    T **twoDarray; 
    int nbrRows; 
    int nbrColumns; 
}; 

#include "Matrix.inl" 

//Matrix.inl 

//Matrix<T>& Matrix<T>::operator= (const Matrix<T>& rhs) 
template<typename T> 
Matrix<T>& Matrix::operator= (const Matrix<T>& rhs) 
{ 
    for (int i = 0; i < nbrRows; i++) 
    { 
     for (int j = 0; j < nbrColumns; j++) 
     { 
      twoDarray[i][j] = rhs.twoDarray[i][j]; 
     } 
    } 

    return *this; 
} 
+0

Если 'rhs' имеет другое количество строк или столбцов, я думаю, что у вас будет плохое время. Я думаю, вы должны устанавливать 'nbrRows' и' nbrColumns' из 'rhs.nbrRows' и' rhs.nbrColumns' и выделять новый 'twoDarray'. – dreamlax

+0

Спасибо за ваш совет, я обязательно посмотрю. –

ответ

4

Вы должны параметры шаблона в имени функции определяется.

template<typename T> 
Matrix<T>& Matrix<T>::operator= (const Matrix<T>& rhs) 
       //^here 

Вы должны написать <T>, хотя он не добавляет к выразительности языка - аргументы, прежде чем :: не может быть ничем иным, кроме списка параметров всего шаблона класса в исходном порядке и без каких-либо изменений , Что есть, то есть.

+0

+1 Или указать * аргументы перед '::' не могут быть чем-либо иным, кроме всего списка параметров шаблона класса *, левая часть '::' должна быть пространством имен или * классом *, а шаблон не является ни –

+0

@ DavidRodríguez-dribeas Правда, но при условии, что стандарт не позволяет указать, какие аргументы шаблона разрешены для этого * class-name *, возможно, было проще запретить там идентификаторы шаблонов и вместо этого потребовать имя шаблона , – Potatoswatter

Смежные вопросы