提问人:haifisch123 提问时间:6/26/2023 最后编辑:JeJohaifisch123 更新时间:7/1/2023 访问量:97
具有多维 std::vectors 的类模板
Class template with multi-dimensional std::vectors
问:
我正在尝试初始化一个 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::vector
int
#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;
}
答:
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>>
double
Matrix
entries
std::vector<std::vector< std::vector<std::vector<double>> >> entries;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ----> "T"
显然,这不是你想要的。你只需要 ,通过它将与类型 。Matrix<double>
entries
std::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;
}
希望这会有所帮助。如果您需要有关任何解决方案的更多描述,请在评论中提问。
下一个:具有约束条件的模板类友谊
评论
Matrix<double> M1(current_entries)
Matrix
std::vector<std::vector<std::vector<std::vector<double>>>>
T
Matrix<std::vector<std::vector<double>>>
std::vector<std::vector<T>>
T
T