如何修复 'expected constructor, destructor, or type conversion before ‘(’ token doublylinkedlist<s>::Node::Node(data)'

how to fix 'expected constructor, destructor, or type conversion before ‘(’ token doublylinkedlist<s>::Node::Node(data)'

我在指南中使用指南创建双向链表,它告诉我使用 Node(data :const string&),但是当我为此创建构造函数时,它抛出 'error: expected constructor, destructor, or type conversion before ‘(’ token doublylinkedlist::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;
}

用户定义的构造函数声明和定义应该匹配。构造函数定义中的 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; 被认为是不好的做法,甚至会导致错误。
看到这个 post:Why is “using namespace std” considered bad practice?

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)不只是在class中声明的,是不小心定义的!它需要去掉花括号。

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。你永远不应该在 header 的全局范围内使用它,因为任何包含 header 的文件现在都可能是一个非常讨厌的惊喜。

另外

Node(const s &data);

可能会变成

Node(const s &data): data(data), next(nullptr), prev(nullptr){}

并消除对

的需求
doublylinkedlist<s>::Node::Node(const s &data)

完全。 : 启动了一个 Member Initializer List,这个工具非常 under-taught 考虑到它的重要性。

在同一个范围内重复同一个变量名被称为阴影。除非你找不到替代方案(你总是可以),否则不要这样做,因为它会让人们感到困惑。他们很容易搞砸这两个 data 变量。