Есть шаблонный класс BaseMatrix
Кусок заголовочного файла:
#ifndef LIFEMATRIX_H
#define LIFEMATRIX_H
#include <QDebug>
typedef unsigned int uint;
template<typename T>
class BaseMatrix
{
public:
explicit BaseMatrix();
~BaseMatrix();
// Выделение памяти под массив
void allocate(size_t rowCount, size_t columnCount)
{
// Выделение памяти под массив
// Инициализируем массив
if (m_matrix != nullptr)
return;
m_matrix = new T*[rowCount];
for (size_t i = 0; i < rowCount; i++)
m_matrix[i] = new T[columnCount];
countCol = columnCount;
countRow = rowCount;
// Заполнение нулями
fillZero();
qDebug() << "Notice:\t Created Matrix [" << countRow << "][" << countCol << "]";
}
// Заново создаем массив (изменяем размер, только всё с нуля)
void reallocate(size_t horizontalCount, size_t verticalCount)
{
qDebug() << "Notice:\t Reallocating memory for a Matrix to ["
<< verticalCount << "]["
<< horizontalCount << "]";
// Переопределение матрицы
deleteMatrix();
allocate(horizontalCount, verticalCount);
}
inline size_t getCountRows() const { return countRow; }
inline size_t getCountColumns() const { return countCol; }
T getElement(size_t row, size_t col)
{
// Получение элемента массива
Q_CHECK_PTR(m_matrix); // Проверка матрицы на существование
Q_ASSERT(row < countRow);
Q_ASSERT(col < countCol);
return m_matrix[row][col];
}
void setElement(size_t row, size_t col, T value)
{
// Задать элемент массива
Q_CHECK_PTR(m_matrix); // Проверка мастрицы на существование
Q_ASSERT(row < countRow);
Q_ASSERT(col < countCol);
m_matrix[row][col] = value;
}
private:
// Матрица, собственно
T **m_matrix;
// Текущее количество клеток
size_t countCol;
size_t countRow;
// Удаление массива
void deleteMatrix()
{
// Удаление массива и освобождение памяти
if (m_matrix == nullptr)
return;
for (size_t i = 0; i < countRow; i++)
delete []m_matrix[i];
delete []m_matrix;
// На всякий случай приравниваем к nullptr
m_matrix = nullptr;
qDebug() << "Notice:\t Deleting a matrix";
}
};
#endif // LIFEMATRIX_H
То есть я определения методов оставил в заголовочном файле, как рекомендовали мне.
Есть класс-наследник LifeMatrix
И наследуется так:
#include "basematrix.h"
class LifeMatrix : public BaseMatrix<bool>
{
public:
LifeMatrix();
То есть мне надо, чтобы класс оперировал сразу с матрицей булевых значений.
И у меня есть странные ошибки:
..\src\lifematrix.h:6: ошибка: expected template-name before '<' token
class LifeMatrix : public BaseMatrix<bool>
^
Ещё такая же на этом же месте
..\src\lifematrix.h:6: ошибка: expected '{' before '<' token
И вот такая на этом же месте
..\src\lifematrix.h:6: ошибка: expected unqualified-id before '<' token
Ну и, пожалуй, ещё одна ошибка. Но подозреваю, что при решении предыдущих, решится и эта. Но эта ошибка в другом классе, где используется LifeMatrix
..\src\processing.h:28: ошибка: field 'm_currentGeneration' has incomplete type 'LifeMatrix'
LifeMatrix m_currentGeneration;
^
Странно, ведь такая запись разрешается(создавал тестовый проект, проверил).
Что я не так делаю?
UPD. Добавил полный код
Проблему нашел. Как оказалось элементарную.
У меня сначала был просто класс LifeMatrix
, но позже мне надо было разделить его. Я переименовал его, а
#ifndef LIFEMATRIX_H
#define LIFEMATRIX_H
остались. Переписал так
#ifndef BASEMATRIX_H
#define BASEMATRIX_H
И всё заработало. Ну и ещё пару мелочей сделал, но они не относятся.
У меня такой мини-вопрос. Обязательно ли в шаблонном классе все методы в заголовочном файле определять?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Имеется программа в виде одного исполняемого файла, доступа к ее исходникам нетТакже есть вспомогательная программа, которая, исходя из особенностей...
Добрый деньПрошу помощи
Когда я использую QPixmap::GrabWindow(WId) на окне с веб браузером (например, Chrome), он возвращает мне просто черный экранИспользую следующий код: