模板,朋友类及其构造函数

时间:2014-10-06 04:05:02

标签: c++ templates constructor

我对模板非常感兴趣。从来没有给我很多指示。我的模板化双链表程序让我的数据结构类工作起来很困难。我终于让它编译没有错误一次,但它有一个运行时错误(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课程,因为它是好朋友吗? headertrailer的零值为零,因为在分配的第一部分,我必须为int类型的列表创建非模板程序,我的教授只是告诉我们将其复制并粘贴到一个新文件中,然后转换&#34;它是一个模板化的版本,所以我知道它可能不应该是零。

当程序到达main.cpp中的第一个构造函数DoublyLinkedList<string> dll时,上面显示的错误恰好发生;所以我知道造成这个问题的构造函数。请帮帮我,我很失落!

1 个答案:

答案 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}}构造函数。此构造函数假定参数指向有效的以空字符结尾的字符串。