【发布时间】:2014-10-06 04:05:01
【问题描述】:
我不擅长模板。从来没有给我太多的指导。我在让我的数据结构类的模板化双向链表程序工作时遇到了很多麻烦。我终于让它编译一次没有错误,但随后它出现了运行时错误(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
...
}
我应该在DListNode 上方声明DoublyLinkedList 类,因为它是朋友,对吧? header 和 trailer 的零值为零,因为在作业的第一部分,我必须为 int 类型的列表创建一个非模板程序,而我的教授刚刚告诉我们复制和将其粘贴到一个新文件中并将其“转换”为模板版本,所以我知道它可能不应该为零。
我上面显示的错误发生在程序到达 main.cpp 中的第一个构造函数DoublyLinkedList<string> dll 时;所以我知道是构造函数导致了这个问题。请帮忙,我很迷茫!
【问题讨论】:
-
您正在使用 0 作为参数初始化
std::string(或者可能是std::wstring)。那是无效的。但是,到目前为止,您在此处展示的任何代码中都没有显示它。 -
我意识到这一点。但无论我作为构造函数的参数输入什么,它都不会为所有类型初始化。所以我的问题是我不知道如何制作一个“自适应”构造函数,将标头和预告片初始化为其所有者类型的“null”值。
-
我想我应该说页眉和拖车的类型是 DListNode
。我将添加一个编辑。 -
@UnworthyToast:使用值初始化
T()对原始类型和默认构造类类型进行零初始化。 -
@MikeSeymour: 如
DoublyLinkedList<T>(): header(T()), trailer(T())?
标签: c++ templates constructor