C++;矩阵类模板继承 我最近开始在C++中编写一个矩阵类。矩阵可以是正方形也可以不是。所以我首先创建了一个矩阵基类模板。然后,我想实现一个SquareMatrix类,来处理反转和其他类似的东西。但它显然不起作用,我犯了以下错误: 我的代码(在代码块上使用GCC):

C++;矩阵类模板继承 我最近开始在C++中编写一个矩阵类。矩阵可以是正方形也可以不是。所以我首先创建了一个矩阵基类模板。然后,我想实现一个SquareMatrix类,来处理反转和其他类似的东西。但它显然不起作用,我犯了以下错误: 我的代码(在代码块上使用GCC):,c++,class,templates,inheritance,matrix,C++,Class,Templates,Inheritance,Matrix,Matrix.hpp: template<unsigned int M, unsigned int N> class Matrix { public: Matrix() {} ... private: std::vector<float> mElements; }; #include "Matrix.hpp" template<unsigned int M> class SquareMatrix: public Matrix&l

Matrix.hpp:

template<unsigned int M, unsigned int N>
class Matrix
{
public:
    Matrix() {}

    ...

private:
    std::vector<float> mElements;
};
#include "Matrix.hpp"

template<unsigned int M>
class SquareMatrix: public Matrix<M, M>
{
    ...
};
模板
类矩阵
{
公众:
矩阵(){}
...
私人:
std::载体融合;
};
SquareMatrix.hpp:

template<unsigned int M, unsigned int N>
class Matrix
{
public:
    Matrix() {}

    ...

private:
    std::vector<float> mElements;
};
#include "Matrix.hpp"

template<unsigned int M>
class SquareMatrix: public Matrix<M, M>
{
    ...
};
#包括“Matrix.hpp”
模板
类平方矩阵:公共矩阵
{
...
};
生成日志:
||===编译:在KirchhofSolver中调试(编译器:GNU GCC编译器)===|

F:\Data\Programmation\KirchhoffSolver\SquareMatrix.hpp | 7 |错误:在“之前应该有模板名。这是一个矩阵类模板,我不久前使用过,它允许使用MxN和MxNxO矩阵。除了构造函数之外,我只有两种方法,那就是将矩阵设置为零并生成单位矩阵。也许这对你有用,但是我没有尝试从这个类“继承”

#include <iostream>

// template<typename TYPE, X, Y, Z>
template<typename T, unsigned X, unsigned Y, unsigned Z = 1>
class Matrix {
public:
    const unsigned x_size = X;
    const unsigned y_size = Y; 
    const unsigned z_size = Z;
    T matrix_[X][Y][Z];

private:

    T identity_[X][Y][Z];

public:
    Matrix();
    Matrix( T elements[X][Y][Z] );

    void identity( T identity[X][Y][Z] );
    void matrix( T matrix[X][Y][Z] );

private:
    void zeroMatrix();
    void makeIdentity();

};

template<typename T, unsigned X, unsigned Y, unsigned Z>
Matrix<T, X, Y, Z>::Matrix() {
    zeroMatrix();
    makeIdentity();
}

template<typename T, unsigned X, unsigned Y, unsigned Z>
Matrix<T, X, Y, Z>::Matrix( T elements[X][Y][Z] ) {
    for ( unsigned k = 0; k < z_size; k++ ) {
        for ( unsigned j = 0; j < y_size; j++ ) {
            for ( unsigned i = 0; i < z_size; i++ ) {
                matrix_[i][j][k] = elements[i][j][k];
            }
        }
    }
}

template<typename T, unsigned X, unsigned Y, unsigned Z>
void Matrix<T, X, Y, Z>::zeroMatrix() {
    for ( unsigned k = 0; k < z_size; k++ ) {
        for ( unsigned j = 0; j < y_size; j++ ) {
            for ( unsigned i = 0; i < x_size; i++ ) {
                matrix_[i][j][k] = 0;
            }
        }
    }
}

template<typename T, unsigned X, unsigned Y, unsigned Z>
void Matrix<T, X, Y, Z>::matrix( T matrix[X][Y][Z] ) {
    for ( unsigned k = 0; k < z_size; k++ ) {
        for ( unsigned j = 0; j < y_size; j++ ) {
            for ( unsigned i = 0; i < x_size; i++ ) {
                matrix[i][j][k] = matrix_[i][j][k];
            }
        }
    }
}

template<typename T, unsigned X, unsigned Y, unsigned Z>
void Matrix<T, X, Y, Z>::makeIdentity() {

    if ( z_size > 1 ) {
        for ( unsigned k = 0; k < z_size; k++ ) {
            for ( unsigned j = 0; j < y_size; j++ ) {
                for ( unsigned i = 0; i < x_size; i++ ) {
                    if ( i == j && i == k && j == k ) {
                        identity_[i][j][k] = 1;
                    } else {
                        identity_[i][j][k] = 0;
                    }
                }
            }
        }
    } else {
        for ( unsigned j = 0; j < y_size; j++ ) {
            for ( unsigned i = 0; i < x_size; i++ ) {
                if ( i == j ) {
                    identity_[i][j][0] = 1; 
                } else {
                    identity_[i][j][0] = 0;         
                }
            }
        }
    }
}

template<typename T, unsigned X, unsigned Y, unsigned Z>
void Matrix<T, X, Y, Z>::identity( T identity[X][Y][Z] ) {
    for ( unsigned k = 0; k < z_size; k++ ) {
        for ( unsigned j = 0; j < y_size; j++ ) {
            for ( unsigned i = 0; i < x_size; i++ ) {
                identity[i][j][k] = identity_[i][j][k];
            }
        }
    }
}

int main() {

    const int x = 4;
    const int y = 4;
    const int z = 4;

    // MxNxO      
    Matrix<int,x,y,z> a;

    int identity3D[x][y][z] = {0};
    a.identity( identity3D );

    std::cout << "MxNxO Matrix Identity of Integer Type: " << std::endl;
    for ( unsigned k = 0; k < z; k++ ) {
        for ( unsigned j = 0; j < y; j++ ) {        
            for ( unsigned i = 0; i < x; i++ ) {
            std::cout << identity3D[i][j][k] << " ";
            }
            std::cout << std::endl;
        }
        std::cout << std::endl;
    }

    std::cout << std::endl << std::endl;

    // MxN Matrix Identity of Float Type - using last template argument with a value of 1.
    const int a = 3;
    const int b = 4;
    const int c = 1;
    Matrix<float,a,b,c> b;

    float idenity2D[a][b][c] = {0};  // Still Need To Use 3RD Array But Set to 1.
    std::cout << "MxN Matrix Identity of Float Type: " << std::endl;

    for ( unsigned k = 0; k < c; k++ ) {
        for ( unsigned j = 0; j < b; j++ ) {        
            for ( unsigned i = 0; i < a; i++ ) {
                std::cout << identity2D[i][j][k] << " ";
            }
            std::cout << std::endl;
        }
        std::cout << std::endl;
    }

    return 0; 
}
#包括
//模板
模板
类矩阵{
公众:
常量无符号x_size=x;
常量无符号y_size=y;
常量无符号z_size=z;
T矩阵_ux[Y][Z];
私人:
T恒等式_ux][Y][Z];
公众:
矩阵();
矩阵(T元素[X][Y][Z]);
无效恒等式(T恒等式[X][Y][Z]);
空洞矩阵(T矩阵[X][Y][Z]);
私人:
空零矩阵();
void makeIdentity();
};
模板
矩阵::矩阵(){
零矩阵();
makeIdentity();
}
模板
矩阵::矩阵(T元素[X][Y][Z]){
for(无符号k=0;k1){
for(无符号k=0;kstd::cout我会自杀,因为这只是一个标题声明问题,与我向您展示的代码无关。所以我的问题解决了!

您读到错误了吗?除了错误之外,您想使用模板还有什么特别的原因吗?是的,我读了错误,并搜索了它,但正如我所说的,我找不到它。我真的想这样做使用模板。因为我可以从它继承SquareMatrix,但也可以从Vector继承SquareMatrix,abd我可以将SquareMatrix和Vector相乘,因为它们的运算符都来自Matrix。这是在MS visual studio 2015中为我构建的-假设在Matrix.hppDo中使用前添加了一个#include。您对代码块不起作用有解释吗?谢谢欧:那很好!但我真的很想了解我做错了什么,以便进步和学习。当我遇到问题时,我更喜欢解决它,而不是接受对方的解决方案!这是完全可以理解的,但我发布了我的,因为我看到了两者的相似之处。唯一的主要区别是我没有hem在一个数组中,就像你在一个向量中一样,而我的将做一个MxNxO和一个MxN,就像你的将只做一个MxN一样。两者之间的相似之处在于它们都是类模板。你试图从中继承,而我到目前为止还没有尝试过,所以我决定也发布我的,因为它与主题和你的问题有关我也很好奇如何从中继承。这也是我感兴趣的-知道如何从类模板继承!从类模板继承可能很棘手,因为模板类型的基类不能派生的一件事是一些运算符重载,更具体地说是
运算符=()
我认为是复制构造函数。这是因为
类a;
类b;
是两个不同的类。这会变得棘手和奇怪。好吧,但是你有没有解释代码块不工作的原因,因为ROX(他在上面回答)可以用VS 2015编译我的代码,并且没有得到任何错误