如何修复“(()令牌双链表<s> :: Node :: Node(data)”之前的预期构造函数,析构函数或类型转换

时间:2019-02-07 05:29:53

标签: c++ class doubly-linked-list

我正在使用指南在指南中创建一个双向链接列表,它告诉我使用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;
}

2 个答案:

答案 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变量。