Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 子类中的类模板非类型成员访问_C++_Templates_Generic Programming_Template Classes_Class Template - Fatal编程技术网

C++ 子类中的类模板非类型成员访问

C++ 子类中的类模板非类型成员访问,c++,templates,generic-programming,template-classes,class-template,C++,Templates,Generic Programming,Template Classes,Class Template,我有一个矩阵类模板,如下所示: 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... } tem

我有一个
矩阵
类模板,如下所示:

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...
}
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::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;
    }
};
模板
类平方矩阵:公共矩阵
{
公众:
矩阵数据跟踪()
{
矩阵数据跟踪{0};
对于(矩阵_size_t j{0};j
我不知道这样做是否正确。请帮我了解发生了什么事

我不知道这样做是否正确

对。您也可以使用
this->m_矩阵


m_matrix
是一个非依赖名称,不会在依赖基类
matrix
中查找,它取决于模板参数
size
。使
m_矩阵
依赖为
matrix::m_矩阵
this->m_矩阵
,则在实例化时将查找名称,届时将知道必须探索的基类专门化。

请编写
trace+=this->m_矩阵[j][j]。继承成员的自动解析在模板类中不起作用。您必须提供一个明确的提示,
m_matrix
来自何处。(你在第三段代码中使用的范围操作符是另一个选择。)明白了!但是,scope操作符的用法正确吗?或者它会在将来的某个时候导致一些UD行为吗?但是,scope操作符的用法正确吗?或者它是否会在将来的某个时候导致UD行为?我真的不相信这会在将来打破。撇开模板不谈,如果您有一个类和一个派生类,其中派生类重载了一个成员,那么如何访问基类的成员(同名)?;-)所以,使用其中任何一个都会导致相同的结果,对吗?或者我还缺少其他东西…比如性能惩罚或未来的UD行为…?@AbhishekAUdupa-like性能惩罚不太可能。我非常肯定,每个严重的C++编译器都应该在两种情况下都发出完全相同的代码。(但您可以在CompilerExplorer中试用。)@AbishekAUdupa,因为这两种方法都适用于成员变量。和函数,我习惯于使用
this->
作为变量。和函数,但类型的范围(其中
this->
不适用)。这还提供了一些“视觉效果”,因为事情更容易区分。(在派生模板类中重载了某些内容,但必须处理基类的重载成员的情况下(如我在其他注释中提到的),那么,当然,您必须再次回到作用域。)现在我明白了。