C++ 我的ctor使用链表和模板有什么问题?

C++ 我的ctor使用链表和模板有什么问题?,c++,C++,我正在尝试使用cpp进行一点练习,希望制作一个链表类,然后对其进行操作、反转、查找圆等。但我不明白我的ctor/ 我有一个主要问题: #include "list.h" #include <iostream> using namespace std; int main () { int x = 10; ListNode<int> node4(); ListNode<int> node3(10 ,node4); } #包括“list.h”

我正在尝试使用cpp进行一点练习,希望制作一个链表类,然后对其进行操作、反转、查找圆等。但我不明白我的ctor/

我有一个主要问题:

#include "list.h"
#include <iostream>


using namespace std;


int main () {
  int x = 10;

  ListNode<int> node4();
  ListNode<int> node3(10 ,node4);
}
#包括“list.h”
#包括
使用名称空间std;
int main(){
int x=10;
ListNode节点4();
ListNode节点3(10,节点4);
}
这是“list.h”:

\ifndef列表\u节点\u H
#定义列表节点
#包括
使用名称空间std;
模板
类ListNode{
ListNode*下一步;
T数据;
公众:
ListNode(T dat=0,const ListNode&nex=NULL):数据(dat),下一个(nex){};
};
#恩迪夫
我不明白为什么这行:
listnodenode3(10,node4)
犯了这个错误,有什么问题

list.cpp:在函数“int main()”中:list.cpp:12:33:错误:无效 从“ListNode()()”到“int”[-fpPermissive]的转换 list.h:15:3:错误:初始化的参数1 'ListNode::ListNode(T,const ListNode&)[带T=int]' [-fppermissive]list.cpp:12:33:警告:将NULL传递给非指针 'ListNode::ListNode(T,const ListNode&)[带T]的参数1= int]'[-Wconversion null]list.cpp:12:33:错误:递归求值 “ListNode::ListNode(T,const ListNode&)”的默认参数的 [with T=int]'list.h:15:3:警告:正在传递 'ListNode::ListNode(T,const ListNode&)[带T=int]'[已启用] 默认情况下]list.h:在构造函数的ListNode::ListNode(T,const)中 ListNode&[with T=int]':list.cpp:12:33:从中实例化 here list.h:15:76:错误:无法将“const ListNode”转换为 初始化中的“ListNode”


这里有几个问题

  • 首先,构造函数不需要
    ListNode()
    simpley
    ListNode(…)

  • 第二,不能将引用参数的defalut设置为null,如果nex可能为null,则它必须是指针


    • 这里有几个问题

      • 首先,构造函数不需要
        ListNode()
        simpley
        ListNode(…)

      • 第二,不能将引用参数的defalut设置为null,如果nex可能为null,则它必须是指针


        • 默认参数是邪恶的(IMO)

          (只是一个想法)
          创建不同的构造函数(一个没有参数,一个有参数,…)

          默认参数是邪恶的(IMO)

          (只是一个想法)
          创建不同的构造函数(一个没有参数,一个有参数,…)

          您的代码有很多错误:

        • 在构造函数中,有一个
          null
          引用作为默认值,这是无效的(请参阅)

        • 对于没有参数的构造函数,您需要省略
          ()
          (您可以了解原因)

        • 像这样的方法应该会奏效:

          using namespace std;
          
          template <class T>
          class ListNode {
              ListNode* next;
              T data;
          
              public:
                    ListNode<T>( T dat = 0 ,ListNode<T> * nex = NULL):data(dat),next(nex){};
          };
          
          
          int main(){
              ListNode<int> node4;
              ListNode<int> node3(10, &node4);
          }
          
          使用名称空间std;
          模板
          类ListNode{
          ListNode*下一步;
          T数据;
          公众:
          ListNode(T dat=0,ListNode*nex=NULL):数据(dat),下一个(nex){};
          };
          int main(){
          ListNode节点4;
          ListNode节点3(10和节点4);
          }
          
          您的代码有许多错误:

        • 在构造函数中,有一个
          null
          引用作为默认值,这是无效的(请参阅)

        • 对于没有参数的构造函数,您需要省略
          ()
          (您可以了解原因)

        • 像这样的方法应该会奏效:

          using namespace std;
          
          template <class T>
          class ListNode {
              ListNode* next;
              T data;
          
              public:
                    ListNode<T>( T dat = 0 ,ListNode<T> * nex = NULL):data(dat),next(nex){};
          };
          
          
          int main(){
              ListNode<int> node4;
              ListNode<int> node3(10, &node4);
          }
          
          使用名称空间std;
          模板
          类ListNode{
          ListNode*下一步;
          T数据;
          公众:
          ListNode(T dat=0,ListNode*nex=NULL):数据(dat),下一个(nex){};
          };
          int main(){
          ListNode节点4;
          ListNode节点3(10和节点4);
          }
          
          是的,您可以为引用参数设置一个默认值,但您是对的,他确实需要一个指针。对于引用,不需要null。在这种情况下,这是没有意义的。是的,引用参数可以有一个默认值,但你是对的,他确实需要一个指针。对于引用,不需要null。在这种情况下,这是没有意义的。另外,使用链表类来存储指向堆栈上对象的指针可能是一个糟糕的设计。@SethCarnegie:我完全同意你的观点。使用链表类来存储指向堆栈上对象的指针也可能是一个糟糕的设计。@SethCarnegie:我完全同意你的观点