我有一个结构:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
我正在尝试初始化它:
ListNode* res = new ListNode();
ListNode* start = res;
但我得到了:
error C2512: 'ListNode' : no appropriate default constructor available
为什么?
答案 0 :(得分:6)
但我得到了:
error C2512: 'ListNode' : no appropriate default constructor available
为什么?
确定您收到了该错误,因为您没有为ListNode
声明的默认构造函数。关于这一点,错误信息非常清楚。
一旦声明了自定义构造函数ListNode(int x);
,编译器就不再为您生成默认构造函数。
要解决此问题,请声明默认构造函数 1
ListNode() : val(), next(NULL) {}
或调用声明的
ListNode* res = new ListNode(42);
1) struct
与此class
的行为完全不同(如果这应该导致您的混淆)。
答案 1 :(得分:1)
在本声明中
ListNode* res = new ListNode();
称为默认构造函数。
但是根据结构定义
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
该结构具有参数化构造函数。
实际上,没有必要为此结构声明构造函数。
最好将其声明为聚合
struct ListNode {
int val;
ListNode *next;
};
最初列表应该是nullptr
指针。例如
ListNode *start = nullptr;
如果您希望最初列表包含节点,那么您可以编写例如
ListNode *start = new ListNode { 10, nullptr };
答案 2 :(得分:-1)
编译器不会为您生成默认值,因为您已经定义了构造函数。只需向其添加默认构造函数或向参数添加默认值(严格意义上与默认构造函数不同),如下所示
struct ListNode {
int val;
ListNode *next;
ListNode(int x = 0) : val(x), next(NULL) {}
};
另外,请改用nullptr
。