Class子class中的模板非类型成员访问
Class Template non-type member access in sub-class
我有一个 Matrix
class 模板,如下所示:
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...
}
我还有一个子class模板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;
}
};
问题是:我无法从 subclass.
访问成员 m_matrix
当我用 Matrix<size,size>::m_matrix
替换 m_matrix
时,子 class 代码有效:
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;
}
};
我不知道这样做是否正确。请帮助我了解发生了什么!
I don't know if this is the right thing to do.
是的。您也可以改用 this->m_matrix
。
m_matrix
是一个非依赖名称,不会在依赖库classMatrix<size, size>
中查找,它依赖于模板参数size
。将 m_matrix
依赖为 Matrix<size, size>::m_matrix
或 this->m_matrix
,然后在实例化时查找名称,那时必须探索的基础 class 专业化将是已知。
我有一个 Matrix
class 模板,如下所示:
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...
}
我还有一个子class模板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;
}
};
问题是:我无法从 subclass.
访问成员m_matrix
当我用 Matrix<size,size>::m_matrix
替换 m_matrix
时,子 class 代码有效:
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;
}
};
我不知道这样做是否正确。请帮助我了解发生了什么!
I don't know if this is the right thing to do.
是的。您也可以改用 this->m_matrix
。
m_matrix
是一个非依赖名称,不会在依赖库classMatrix<size, size>
中查找,它依赖于模板参数size
。将 m_matrix
依赖为 Matrix<size, size>::m_matrix
或 this->m_matrix
,然后在实例化时查找名称,那时必须探索的基础 class 专业化将是已知。