2016-06-26 4 views
0

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

template <class T> 
void Matrix<T>::add(const Matrix &m) { 
    for (int i = 0; i < this->rows; ++i) { 
     for (int j = 0; j < this->cols; ++j) { 
      this->mat[i][j] += m.at(i,j); 
     } 
    } 
} 

Это работает очень хорошо, например. если я добавлю пример Matrix<double> в Matrix<double>.

Но я не могу заставить его работать, добавляя Matrix<int> к Matrix<double> например:

Matrix<double> matA(2,2); 
Matrix<int> matB(2,2); 
matA.add(matB); 

Компилятор (г ++ 4.8) жалуется:

error: no matching function for call to ‘Matrix<double>::add(Matrix<int>&) 

Что может быть обходной путь?

ответ

4

Внутри шаблона класса имя шаблона является ярлыком для текущего экземпляра. То есть Matrix - это то же самое, что и Matrix<T>. Итак, объявив void add(const Matrix& m);, вы говорите, что можете добавить другую матрицу того же типа.

Если вы хотите добавить другую матрицу произвольного типа, вам необходимо ввести для нее другой параметр шаблона.

template <class T> 
class Matrix { 
    // ... 
public: 
    template <class U> 
    void add(const Matrix<U>& m); 
}; 

template <class T> template <class U> 
void Matrix<T>::add(const Matrix<U>& m) { 
    // ... 
} 
Смежные вопросы