#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: Неправильным является аргумент по умолчанию в определении — он может использоваться только с объявлениями.