如何修复 '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
变量。
我在指南中使用指南创建双向链表,它告诉我使用 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
变量。