Наследование шаблонного класса

308
11 июля 2017, 21:42

Есть шаблонный класс 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. Добавил полный код

Answer 1

Проблему нашел. Как оказалось элементарную. У меня сначала был просто класс LifeMatrix, но позже мне надо было разделить его. Я переименовал его, а

#ifndef LIFEMATRIX_H
#define LIFEMATRIX_H

остались. Переписал так

#ifndef BASEMATRIX_H
#define BASEMATRIX_H

И всё заработало. Ну и ещё пару мелочей сделал, но они не относятся.

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

READ ALSO
Обращение к элементу в векторе структур

Обращение к элементу в векторе структур

У меня есть структура Words

221
Как объединить два exe файла в один

Как объединить два exe файла в один

Имеется программа в виде одного исполняемого файла, доступа к ее исходникам нетТакже есть вспомогательная программа, которая, исходя из особенностей...

548
QPixmap не делает скрин окна веб браузера

QPixmap не делает скрин окна веб браузера

Когда я использую QPixmap::GrabWindow(WId) на окне с веб браузером (например, Chrome), он возвращает мне просто черный экранИспользую следующий код:

198