我对模板非常感兴趣。从来没有给我很多指示。我的模板化双链表程序让我的数据结构类工作起来很困难。我终于让它编译没有错误一次,但它有一个运行时错误(what(): basic_string::_S_construct null not valid
)并崩溃。
template<class T> class DoublyLinkedList;
{...}
template<class T> class DListNode {
...
friend class DoublyLinkedList<T>;
};
template<class T> class DoublyLinkedList {
...
protected: DListNode<T> header, trailer;
public:
DoublyLinkedList<T>() : header(0), trailer(0) // constructor
{ header.next = &trailer; trailer.prev = &header; }
DoublyLinkedList<T>(const DoublyLinkedList<T>& dll); // copy constructor
~DoublyLinkedList<T>(); // destructor
...
}
我应该宣布DoublyLinkedList
以上的DListNode
课程,因为它是好朋友吗? header
和trailer
的零值为零,因为在分配的第一部分,我必须为int
类型的列表创建非模板程序,我的教授只是告诉我们将其复制并粘贴到一个新文件中,然后转换&#34;它是一个模板化的版本,所以我知道它可能不应该是零。
当程序到达main.cpp中的第一个构造函数DoublyLinkedList<string>
dll时,上面显示的错误恰好发生;所以我知道造成这个问题的构造函数。请帮帮我,我很失落!
答案 0 :(得分:0)
我应该在DListNode上面声明DoublyLinkedList类 因为这是朋友吗?
错误。友元声明在您放置友元声明的struct / class的封闭范围中兼作前向声明。因此,以下示例转发声明了类ns::Bar
。
namespace ns {
class Foo
{
friend class Bar;
};
} // namespace ns
标题和预告片的零值为零,因为在 分配的第一部分,我必须创建一个非模板 程序只是为int类型的列表,我的教授告诉我们 将其复制并粘贴到一个新文件中并将其“转换”为模板化 版本,所以我知道它可能不应该是零。
听起来像一个明智的方法,除了我怀疑你的非模板列表类已经有问题。应该可以创建一个空列表,即根本不包含任何节点的列表。
上面显示的错误恰好在程序到达时发生 main.cpp中的第一个构造函数,DoublyLinkedList dll;,所以我 知道它是造成这个问题的构造函数。请帮帮我 很丢失!
您可能正在调用std::string
的{{1}}构造函数。此构造函数假定参数指向有效的以空字符结尾的字符串。