我正在使用指南在指南中创建一个双向链接列表,它告诉我使用Node(data:const string&),但是当我为此创建构造函数时,它会抛出“错误:预期的构造函数,析构函数或'('令牌双链表:: Node :: Node(data)'之前的类型转换
#ifndef __DOUBLYLINKEDLIST_H__
#define __DOUBLYLINKEDLIST_H__
//
//
#include <iostream>
#include <string>
using namespace std;
template <class s>
class doublylinkedlist {
public:
doublylinkedlist();
~doublylinkedlist();
void append (s& data);
void insertBefore (s& data);
void remove (s& data);
bool empty();
void begin();
void end();
bool next();
bool prev();
bool find(s& data);
string data;
const string &getData(){return data;}
private:
class Node
{
public:
Node(const string &data){}
~Node();
Node(s& data);
Node* next;
Node* prev;
string *data;
};
Node* head;
Node* tail;
Node* current;
};
template <class s>
doublylinkedlist<s>::Node::Node(data)
{
this->data;
this->next=nullptr;
this->prev=nullptr;
}
答案 0 :(得分:0)
用户定义的构造函数声明和定义应匹配。构造函数定义中的data
没有类型。
您的构造函数应如下所示:
template <class s>
doublylinkedlist<s>::Node::Node(s& data)
{
this->next=nullptr;
this->prev=nullptr;
}
以下行不执行任何操作。因此可以将其删除。或分配了data
参数。
this->data; // this->data = data; ??
此外,头文件中的using namespace std;
被认为是不良做法,甚至可能导致错误。
看到这篇文章:Why is “using namespace std” considered bad practice?
答案 1 :(得分:0)
在
template <class s>
doublylinkedlist<s>::Node::Node(data)
{
this->data; // whups! Something should be assigned here. this->data = data;
this->next=nullptr;
this->prev=nullptr;
}
doublylinkedlist<s>::Node::Node(data)
不提供数据类型data
。应该是
doublylinkedlist<s>::Node::Node(const string &data)
匹配声明。
这是您当前看到的错误。可是等等!还有更多!
doublylinkedlist<s>::Node::Node(const string &data)
不仅在类中声明,而且是意外定义的!它需要失去大括号。
Node(const string &data){}
必须成为
Node(const string &data);
否则,编译器将找到构造函数的两个实现,并且失败。
但这并没有任何意义。该节点应存储s
,而不是string
,
所以
Node(const s &data){}
确实需要
Node(const s &data);
和
doublylinkedlist<s>::Node::Node(const string &data)
必须
doublylinkedlist<s>::Node::Node(const s &data)
旁注:
建议您不要使用using namespace std;
。 Explanation here。您永远不要在标头中的全局范围内使用它,因为任何包含标头的文件现在都可以进入,这非常令人讨厌。
另外
Node(const s &data);
有可能成为
Node(const s &data): data(data), next(nullptr), prev(nullptr){}
并消除对
的需求doublylinkedlist<s>::Node::Node(const s &data)
完全。 :
启动了Member Initializer List,这是一个非常重要的工具,考虑到它的重要性。
在相同范围内重复相同的变量名称称为“阴影”。除非您找不到替代方法(总是可以),否则不要这样做,因为它会使人们感到困惑。他们可以很容易地弄错两个data
变量。