Доступ к шаблону класса, не являющийся членом типа, в подклассе - PullRequest
2 голосов
/ 08 мая 2020

У меня есть шаблон класса Matrix, который выглядит следующим образом:

using matrix_size_t = unsigned int;
using matrix_data_t = double;

template <matrix_size_t row, matrix_size_t col>
class Matrix
{
protected:
    matrix_data_t m_matrix[row][col];

//more code irrelevant to the question...
}

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

template <matrix_size_t size>
class SquareMatrix :public Matrix<size, size>
{
public:
    matrix_data_t trace()
    {
        matrix_data_t trace{ 0 };
        for (matrix_size_t j{ 0 }; j < size; ++j)
        {
            trace += m_matrix[j][j]; //C3861 error in MVS: m_matrix identifier not found
        }
        return trace;
    }
};

Проблема is: Я не могу получить доступ к члену m_matrix из подкласса.

Когда я заменяю m_matrix на Matrix<size,size>::m_matrix, код подкласса работает:

template <matrix_size_t size>
class SquareMatrix :public Matrix<size, size>
{
public:
    matrix_data_t trace()
    {
        matrix_data_t trace{ 0 };
        for (matrix_size_t j{ 0 }; j < size; ++j)
        {
            trace += Matrix<size, size>::m_matrix[j][j]; //this works
        }
        return trace;
    }
};

Я не знаю, правильно ли это делать. Помогите, пожалуйста, разобраться в том, что происходит!

1 Ответ

2 голосов
/ 08 мая 2020

Не знаю, правильно ли это.

Да. Вы также можете использовать вместо него this->m_matrix.

m_matrix - это независимое имя, которое не будет искать в зависимом базовом классе Matrix<size, size>, оно зависит от параметра шаблона size. Сделав m_matrix зависимым как Matrix<size, size>::m_matrix или this->m_matrix, тогда имя будет просматриваться во время создания экземпляра, тогда будет известна специализация базового класса, которая должна быть исследована.

...