如何解决(‘令牌doublylinkedlist“预期构造,析构函数,或类型之前转化’ ::节点::节点(数据)”

问题描述 投票:0回答:2

我使用的指导方针,以创建doublylinkedlist在引导它告诉我使用节点(数据:常量字符串&),但是当我去创造的构造这一点,抛出“错误:预期的构造函数,析构函数或类型转换前'(' 令牌doublylinkedlist ::节点::节点(数据)”

 #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;
}
c++ class doubly-linked-list
2个回答
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)

相匹配的声明。

这就是你目前看到的bug。可是等等!还有更多!

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


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?

© www.soinside.com 2019 - 2024. All rights reserved.