构造函数必须显式初始化没有默认构造函数的成员

Posted

技术标签:

【中文标题】构造函数必须显式初始化没有默认构造函数的成员【英文标题】:Constructor must explicitly initialize the member which does not have a default constructor 【发布时间】:2017-11-04 04:10:42 【问题描述】:

我在编译时不断收到此错误。我不确定我的模板构造函数是否有问题,或者我如何将类型“处理程序”插入到双向链表中。

./ListNode.h:14:3: error: constructor for 'ListNode<Handler>' must explicitly
      initialize the member 'data' which does not have a default constructor
                ListNode(T d);
                ^
./doublyLinked.h:70:25: note: in instantiation of member function
      'ListNode<Handler>::ListNode' requested here
        ListNode<T> *node= new ListNode<T>(d);
                               ^
simulation.cpp:56:20: note: in instantiation of member function
      'DoublyLinkedList<Handler>::insertBack' requested here
                                                handlerList->insertBack(*handler);
                                                             ^
./ListNode.h:9:5: note: member is declared here
                T data;
                  ^
./handler.h:4:7: note: 'Handler' declared here
class Handler
      ^

这里是完整代码的 github -> https://github.com/Cristianooo/Registrar-Simulator

【问题讨论】:

【参考方案1】:

https://isocpp.org/wiki/faq/ctors#init-lists

不要写

template <class T>
ListNode<T>::ListNode(T d)

    data=d;
    next=NULL;
    prev=NULL;

因为T dataListNode&lt;T&gt; 构造函数运行时没有正确构造。

改为写

template<class T>
ListNode<T>::ListNode(const T& d) : data(d), next(0), prev(0) 

假设T 有一个复制构造函数。

在 C++11 中,您应该使用 nullptr 并另外提供一种无需使用右值引用复制即可放置数据的方法。

template<class T>
ListNode<T>::ListNode(T&& d) : data(std::move(d)), next(nullptr), prev(nullptr) 

此外,在 C++11 中,您可能还希望将这些构造函数标记为 explicit,以避免从 TNode&lt;T&gt; 的潜在隐式转换。

template<class T>
class ListNode 
public:
    explicit ListNode(const T& data);
    explicit ListNode(T&& data);
;

您的代码还在 .h 文件中定义了非内联代码,这可能会导致以后违反 ODR。

【讨论】:

以上是关于构造函数必须显式初始化没有默认构造函数的成员的主要内容,如果未能解决你的问题,请参考以下文章

C++调用父类的构造函数规则

何时子类必须显示调用父类带参构造函数

C++中派生类的构造函数怎么显式调用基类构造函数?

9——对象的创建和撤销,构造函数和析构函数

使用显式定义的默认构造函数将 unique_ptr 的类内成员初始化程序设置为 nullptr 错误

成员函数