Недопустимое использование шаблона-имени «Матрица» без списка аргументов

#c #templates #compiler-errors

#c #шаблоны #ошибки компилятора

Вопрос:

Вот мой 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;

}
 

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

ошибка: недопустимое использование шаблона-имени ‘Матрица’ без списка аргументов

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

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

РЕДАКТИРОВАТЬ: вот мой файл 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 матрицы ‘Matrix:: Matrix (int, int, T)’.h: 16:3: ошибка: после предыдущей спецификации в ‘Matrix:: Matrix (int, int, T)’

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

Комментарии:

1. Так почему же вы не говорите нам, в какой строке эта ошибка?

2. Ошибка в строке Matrix::Matrix<T>(int r, int c, T fill = 1)

Ответ №1:

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

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

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

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

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

Комментарии:

1. Где должен быть приведенный выше код? Я так изменился в Matrix.cpp выше, и он по-прежнему выдает ошибку. : S

2.@thameera, какую ошибку он выдает. У вас #include Matrix.cpp есть файл, как я предложил в моем ответе? Для template s вы должны показать объявление и определение al для кода, который его использует. Вот почему люди пытаются создать template определение в class теле.

3. Я отредактировал вопрос с помощью Matrix.h, Matrix.cpp и ошибки. Есть идеи, что не так?

4. @thameera, смотрите отредактированный ответ. Проблема, похоже, связана с аргументом по умолчанию.

Ответ №2:

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

 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

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

Комментарии:

1. Можете ли вы дать нам определение Matrix, то есть «Matrix.h», чтобы мы могли взглянуть?

2. Я отредактировал вопрос с помощью Matrix.h, Matrix.cpp и ошибки. Есть идеи, что не так?

3. @thameera: Неправильным является аргумент по умолчанию в определении — он может использоваться только с объявлениями.