Неправильное использование имени шаблона Matrix без списка аргументов - PullRequest
5 голосов
/ 21 октября 2011

Вот мой файл Matrix.cpp. (есть отдельный файл Matrix.h)

#include <iostream>
#include <stdexcept>

#include "Matrix.h"

using namespace std;

Matrix::Matrix<T>(int r, int c, T fill = 1)
{
  if (r > maxLength || c > maxLength) {
    cerr << "Number of rows and columns should not exceed " << maxLen << endl;
    throw 1;
  }

  if (r < 0 || c < 0) {
    cerr << "The values for the number of rows and columns should be positive" << endl;
    throw 2;
  }

  rows = r;
  cols = c;

  for (int i = 0; i < rows; i++)
    for (int j = 0; j < cols; j++)
      mat[i][j] = fill;

}

Это дает следующее

ошибка: недопустимое использование имени шаблона "Matrix" без списка аргументов

В чем проблема в моем коде?

РЕДАКТИРОВАТЬ: Матрица класса определяется с template<class T>

EDIT: Вот мой файл Matrix.h:

#include <iostream>
#include <math.h>

#define maxLength 10;

using namespace std;

template <class T>

class Matrix
{
public:
    Matrix(int r, int c, T fill = 1);

private:
    int rows, cols;
        T mat[10][10];
};

А вот файл Matrix.cpp:

#include <iostream>
#include <stdexcept>

#include "Matrix.h"

using namespace std;

template<class T>
Matrix<T>::Matrix(int r, int c, T fill = 1)
{
}

Это дает следующую ошибку:

Matrix.cpp: 12: 43: ошибка: аргумент по умолчанию для параметра 3 Rix Matrix :: Matrix (int, int, T) ’Matrix.h: 16: 3: ошибка: после предыдущего спецификация в «Matrix :: Matrix (int, int, T)»

Что не так в моем коде?

Ответы [ 2 ]

15 голосов
/ 21 октября 2011

Если ваш класс является шаблоном, тогда правильное определение должно быть,

template<class T>
Matrix<T>::Matrix(int r, int c, T fill)  // don't give default argument
...

Кроме того, не забудьте включить этот Cpp-файл, где вы используете этот класс. Потому что в случае шаблонов полное тело должно быть видно для всех единиц перевода.

Редактировать : После вашего отредактированного вопроса я заметил, что ошибка говорит само за себя.

Вы не должны указывать аргумент по умолчанию внутри определения метода. Достаточно дать в декларации (которую вы уже дали). Сделайте определение template, как показано выше, и ошибка исчезнет.

3 голосов
/ 21 октября 2011

Вы должны написать как:

template<class T>
Matrix<T>::Matrix(int r, int c, T fill = 1)
{
  ..
}

Да, это утомительно.И, возможно, не стоит помещать определения шаблонов в исходный файл, см. http://www.parashift.com/c++-faq-lite/templates.html#faq-35.12

. Поэтому самый простой способ - поместить определения членов шаблона в определение шаблона класса в заголовочном файле.

...