【发布时间】:2020-08-23 15:02:39
【问题描述】:
我有一个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;
}
};
问题是:我无法从子类访问成员 m_matrix。
当我用Matrix<size,size>::m_matrix 替换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;
}
};
我不知道这样做是否正确。请帮助我了解发生了什么!
【问题讨论】:
-
请写
trace += this->m_matrix[j][j];。继承成员的自动解析在模板类中不起作用。您必须提供m_matrix确实来自何处的明确提示。 (您在第三个 sn-p 中使用的范围运算符是另一种选择。) -
明白了!但是,作用域运算符的用法正确吗?还是会在未来某个时候导致一些 UD 行为?
-
但是,作用域运算符的用法正确吗?或者它会在未来的某个时候导致一些 UD 行为? 我真的不相信这会在未来打破。除了模板,如果你有一个类和一个派生类,其中派生类重载了一个成员,你如何访问基类的成员(同名)? ;-)
标签: c++ templates generic-programming template-classes class-template