Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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++ - Fatal编程技术网

C++ 铸造模板(矩阵)类

C++ 铸造模板(矩阵)类,c++,C++,我有一个模板矩阵类,我想从中直观地将一种类型的实例转换为另一种类型的实例(例如,matrix到matrix) 包含该类的头文件如下所示: #ifndef MATRIX_H #define MATRIX_H #include <cstdlib> #include <vector> template <class T> class Matrix { private: std::vector<T> _data; st

我有一个模板矩阵类,我想从中直观地将一种类型的实例转换为另一种类型的实例(例如,
matrix
matrix

包含该类的头文件如下所示:

#ifndef MATRIX_H
#define MATRIX_H

#include <cstdlib>
#include <vector>

template <class T> class Matrix
{

  private:

    std::vector<T>      _data;
    std::vector<size_t> _shape;
    std::vector<size_t> _strides;

  public:

    Matrix               (const Matrix<T> &) = default;
    Matrix<T>& operator= (const Matrix<T> &) = default;

    Matrix<T>(){};

    // explicit constructor
    Matrix<T>( size_t nrow , size_t ncol )
    {
      _shape.push_back(nrow);
      _shape.push_back(ncol);

      while ( _data.size()<_shape[0]*_shape[1] )
        _data.push_back((T)0);
    };

    T& operator[] ( size_t i )
    { return _data[i]; };

    T& operator() ( size_t i, size_t j )
    { return _data[i*_shape[1]+j]; };

    size_t size ( void ) const
    { return _data.size(); };

    std::vector<size_t> shape ( void ) const
    {
      std::vector<size_t> ret(2);
      for ( size_t i=0 ; i<2 ; i++ )
        ret[i] = _shape[i];
      return ret;
    };

};

#endif
#ifndef矩阵
#定义矩阵
#包括
#包括
模板类矩阵
{
私人:
std::vector_数据;
std::向量_形;
std::矢量_步;
公众:
矩阵(常数矩阵&)=默认值;
矩阵和运算符=(常数矩阵&)=默认值;
矩阵(){};
//显式构造函数
矩阵(大小为NOW,大小为ncol)
{
_形状。向后推(nrow);
_形状。推回(ncol);
而(_data.size()shape());
对于(size_t i=0;isize();i++)
out[i]=静态数据转换(数据[i]);
返回;
}
您需要定义一个“模板复制构造函数”(某种类型)。让我们从清理现有构造函数开始:

Matrix<T>( size_t nrow , size_t ncol )
template<typename From>
Matrix(const Matrix<From> &s)
然后,定义一个模板化的伪复制构造函数:

Matrix<T>( size_t nrow , size_t ncol )
template<typename From>
Matrix(const Matrix<From> &s)
模板
矩阵(常数矩阵和s)
现在,编写这个构造函数,就像编写副本构造函数一样

之后,还应该编写一个模板化赋值运算符

template<typename From>
Matrix &operator=(const Matrix<From> &f)
模板
矩阵和运算符=(常数矩阵和f)
再次,假设这是一个普通的赋值运算符,并完成实现一个赋值运算符的过程。

您需要定义一个“模板副本构造函数”(某种类型)。让我们从清理现有构造函数开始:

Matrix<T>( size_t nrow , size_t ncol )
template<typename From>
Matrix(const Matrix<From> &s)
然后,定义一个模板化的伪复制构造函数:

Matrix<T>( size_t nrow , size_t ncol )
template<typename From>
Matrix(const Matrix<From> &s)
模板
矩阵(常数矩阵和s)
现在,编写这个构造函数,就像编写副本构造函数一样

之后,还应该编写一个模板化赋值运算符

template<typename From>
Matrix &operator=(const Matrix<From> &f)
模板
矩阵和运算符=(常数矩阵和f)
再次,假设这是一个普通的赋值运算符,并进行实现。

std::vector
不能赋值给
std::vector
,因此您不能只分配成员,而必须显式地进行转换

你可以写一封信

模板
算子矩阵(){
矩阵矩阵(shape()[0],shape()[1]);
对于(大小i=0;i
如果
#include
)可以删除
启用,但我建议保留它,因为它不允许矩阵mat=Matrix()的静默通过。

另外,在您的ctor中使用
\u data.resize(\u shape[0]*\u shape[1])
可能是一个好主意,因为您当前有不必要的算法复杂性。

std::vector
不能分配给
std::vector
,因此您不能只分配您的成员,而必须显式地进行转换

你可以写一封信

模板
算子矩阵(){
矩阵矩阵(shape()[0],shape()[1]);
对于(大小i=0;i
如果
#include
)可以删除
启用,但我建议保留它,因为它不允许矩阵mat=Matrix()的静默通过。

另外,在您的ctor中使用
\u data.resize(\u shape[0]*\u shape[1]);
可能是一个好主意,因为您当前有不必要的算法复杂性