具有多维 std::vectors 的类模板

Class template with multi-dimensional std::vectors

提问人:haifisch123 提问时间:6/26/2023 最后编辑:JeJohaifisch123 更新时间:7/1/2023 访问量:97

问:

我正在尝试初始化一个 Matrix 类模板,该模板将任何类型的 2D 向量作为参数输入:

#include <iostream>
#include <vector>

template <class T>
class Matrix 
{
    std::vector<std::vector<T>> entries;

public:
    // Constructor with parameters
    Matrix(std::vector<std::vector<T>> Entries) { 
        entries = Entries;
    }
};

int main() 
{
    std::vector<std::vector<double>> current_entries = { 
        {1, 2, 3}, {-4, 3, 6}, {-7, 8, 9}
    };
    Matrix<std::vector<std::vector<double>>> M1(current_entries); // line 19
    return 0;
}

但这在第 19 行给出了错误:

error: no matching function for call to 
'Matrix<std::vector<std::vector<double> > >::Matrix(std::vector<std::vector<double> >&)'

我怀疑它与类型 a 有关,因为当我用 s 替换所有 2D 向量时,在不更改其他任何东西的情况下,它有效:std::vectorint

#include <iostream>
#include <vector>

template <class T>
class Matrix 
{
    T entries;

public:
    // Constructor with parameters
    Matrix(T Entries) { 
        entries = Entries;
    }
};

int main() 
{
    double current_entries = 3;
    Matrix<double> M1(current_entries); // line 19
    return 0;
}
C++ 模板 stdvector 类模板

评论

1赞 Jarod42 6/26/2023
应该是 ,否则你有一个 “matrix” ()。Matrix<double> M1(current_entries)Matrixstd::vector<std::vector<std::vector<std::vector<double>>>>
1赞 JaMiT 6/26/2023
你对你的期望是什么?这是什么?TMatrix<std::vector<std::vector<double>>>std::vector<std::vector<T>>T
0赞 JaMiT 6/27/2023
澄清我之前的评论(因为当它正式成为建议时,它可以被视为一个答案):我认为如果你的问题包含我关于你对 .对你的期望的理论解释往往比展示实验结果更能证明“展示研究努力”。(当然,理论和实验是另一种选择。T

答:

2赞 JeJo 6/26/2023 #1

我怀疑这与类型有关,[...]vector

该错误与类型无关,而是您使用错误的类型实例化了类。std::vector

该行的类模板参数

Matrix<std::vector<std::vector<double>>> M1(current_entries);
//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  --> is the "T"

莫。因此,您可以使用以下类型实例化:std::vector<std::vector<double>>doubleMatrixentries

 std::vector<std::vector< std::vector<std::vector<double>> >>    entries;
 //                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ----> "T"

显然,这不是你想要的。你只需要 ,通过它将与类型 。Matrix<double>entriesstd::vector<std::vector<double>>

0赞 Mahendra Panpalia 6/26/2023 #2

错误的原因已经在评论中解释过。 将扩大条目,我相信这不是你想要的结果。T=vector<vector<float>>vector<vector<vector<vector<float>>>>

您可以保留如下所示的通用解决方案,然后 T 可以成为您想要的矩阵

#include <iostream>
#include <vector>

template <class T>
class Matrix{
    T entries;
    public:
    Matrix(T Entries) { // Constructor with parameters
      entries = Entries;
    }

};

using namespace std;

int main()
{
    std::cout << "Lets's Start...." << std::endl;
    std::vector<std::vector<double>> current_entries ={{1, 2, 3}, {-4, 3, 6}, {-7, 8, 9}};
    Matrix<std::vector<std::vector<double>>> M1(current_entries); // line 19
    std::cout << "All is well " << std::endl;
    return 0;
}

或者,您也可以使用模板部分专业化,并且可以提供单独的实现,如下所示。vector<vector<T>>

#include <iostream>
#include <vector>

template <class T>
class Matrix {
    T entries;

public:
    Matrix(T Entries) : entries(Entries) {
        // Constructor with parameters
    }
};

// Partial specialization for std::vector<std::vector<T>>
// It should always be implemented after above template
template <class T>
class Matrix<std::vector<std::vector<T>>> {
    std::vector<std::vector<T>> entries;

public:
    Matrix(std::vector<std::vector<T>> Entries) : entries(Entries) {
        // Constructor with parameters
    }
};

int main() {
    std::cout << "Let's Start...." << std::endl;
    std::vector<std::vector<double>> current_entries = {{1, 2, 3}, {-4, 3, 6}, {-7, 8, 9}};
    Matrix<std::vector<std::vector<double>>> M1(current_entries);
    std::cout << "All is well " << std::endl;
    return 0;
}

希望这会有所帮助。如果您需要有关任何解决方案的更多描述,请在评论中提问。