gpt4 book ai didi

c++如何使用模板调用内部类的构造函数?

转载 作者:行者123 更新时间:2023-11-30 03:18:28 25 4
gpt4 key购买 nike

我想通过调用 Nach(3, a) 创建一个 Nach 对象,其中 a 是 Mat 对象。在这一点上有些事情失败了。(行:Graph::Nach h = Graph::Nach(3,a);)

Nach 定义在 Graph 的内部类中。Graph 使用两个模板。Nach 代表邻居,Mat 代表 Material ,Masch 代表机器。

#include <iostream>
#include <vector>
#include <string>

class Mat {

public:
int _id;
int _type;
double _amount;

Mat (int id, int type, double amount );
};
Mat::Mat(int id, int type, double amount){
std::cout<<"Mat constuktor used"<<std::endl;
_id = id; _type = type; _amount = amount;
};




class Masch {
public:
int _id;
int _rez;
double _count;

Masch (int id, int rez, double count );

};
Masch::Masch(int id, int rez, double count){
std::cout<<"Masch constuktor used"<<std::endl;
_id = id; _rez = rez; _count = count;
};


template <class V, class E>
class Graph {
public:
class Nach {
public:
int _id;
Mat _e;

Nach(int id, Mat e);
};

int num;
std::vector<V> nodes;
std::vector<std::vector<Nach>> _nach;

void addVertex(V t);
void addEdge(V a, V b, E e);

Graph();


};
template <class V, class E> Graph<V,E>::Graph(){
std::cout<<"Graph constuktor used"<<std::endl;
num = 0;
}
template <class V, class E> Graph<V,E>::Nach::Nach(int id, Mat e){
std::cout<<"Nach constuktor used"<<std::endl;
_id = id; _e = e;
}
template <class V, class E> void Graph<V,E>::addVertex(V t){
nodes.push_back(t);
_nach.push_back(std::vector<Nach>());
num++;
}
template <class V, class E> void Graph<V,E>::addEdge(V a, V b, E e){
int i = a._id;
int j = b._id;
//Graph<V, E>::Nach x(3, e);
//_nach[j].push_back(Nach(i,e));

}

int main (){

Mat a= Mat(0,1,0.1);
//Mat b= Mat(1,1,0.3);

Masch c = Masch(0,0,0.1);

Graph <Masch, Mat> g = Graph<Masch, Mat>();

//std::cout << a+b <<std::endl;
//std::cout << c <<std::endl;

Graph<Masch, Mat>::Nach h = Graph<Masch, Mat>::Nach(3,a);

g.addVertex(c);
g.addVertex(c);

//g.addEdge(c,c,a);


return 0;

}

我希望创建 Nach 类的一个实例。

但它引发了 Mat 构造函数的调用错误。我没有看到“Nach”的调用在哪里调用了“Mat”

错误提示

Hello.cpp: In instantiation of ‘Graph<V, E>::Nach::Nach(int, Mat) [with V = Masch; E = Mat]’:
Hello.cpp:94:57: required from here
Hello.cpp:65:65: error: no matching function for call to ‘Mat::Mat()’
template <class V, class E> Graph<V,E>::Nach::Nach(int id, Mat e){
^
Hello.cpp:16:1: note: candidate: Mat::Mat(int, int, double)
Mat::Mat(int id, int type, double amount){
^
Hello.cpp:16:1: note: candidate expects 3 arguments, 0 provided
Hello.cpp:7:7: note: candidate: constexpr Mat::Mat(const Mat&)
class Mat {
^
Hello.cpp:7:7: note: candidate expects 1 argument, 0 provided
Hello.cpp:7:7: note: candidate: constexpr Mat::Mat(Mat&&)
Hello.cpp:7:7: note: candidate expects 1 argument, 0 provided

最佳答案

当您调用Nach 构造函数时,默认构造每个成员,然后执行构造函数主体。 Mat 没有默认构造函数。您看不到错误消息中提到的对 Mat() 的调用,因为该调用是由编译器生成的。解决方案是使用 initialisation list而不是构建然后分配。大多数情况下,构造函数体应该是空的。

template <class V, class E>
Graph<V, E>::Nach::Nach(int id, Mat e)
: _id{id}, _e{e} {}

这直接构造成员而不是首先默认构造它们然后分配给它们(就像你在 Java 中那样)。您应该始终使用初始化列表。

还有一些其他的事情我应该提一下。

  • 在模板参数列表中使用class 有点过时。 class 允许向后兼容,所以应该避免。 class 最初是为了避免在语言中添加另一个关键字,typename 是后来添加的。
  • 以一个或多个 _underscores_ 开头的标识符通常不是一个好主意。这是因为以下划线开头的标识符是为实现保留的,因此您可能会发生冲突。
  • 使用初始化列表时,构造函数参数可以与成员同名,因此允许以下内容并按预期运行。很少有任何理由在成员名称中放置下划线(或任何其他字符序列)以避免冲突。

这就是我实现构造函数的方式。

template <typename V, typename E>
Graph<V, E>::Nach::Nach(const int id, const Mat e)
: id{id}, e{e} {}

关于c++如何使用模板调用内部类的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54732652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com