&#34;无法转换&#39; SinglyLinkedList <int> :: node *&#39;到&#39; int *&#39;由于-Wfatal-errors而导致分配编译终止。&#34; </int>

时间:2015-04-18 20:32:19

标签: c++ c++98

错误

  

t.cpp:在构造函数&#39; SinglyLinkedList :: SinglyLinkedList(T *,   size_t)[with T = int]&#39;:t.cpp:29:从这里实例化第51行:   错误:无法转换&#39; SinglyLinkedList :: node *&#39;到&#39; int *&#39;在   由于-Wfatal-errors,赋值编译终止。

在下面的行中

   node * lastNode = new node;
   lastNode->val = *arr;
   lastNode->next = NULL;
   for (T * pa(arr+1), * pb(arr+n); pa != pb; ++pa)
   {
      node * thisNode = new node;
      thisNode->val = *pa;
      thisNode->next = NULL;
      lastNode->next = thisNode; // error 
      lastNode = thisNode;
      delete thisNode;      
   }

完整代码在此处:http://codepad.org/gZ2KnrUM

无法弄清楚该行的语法错误。

加分问题:是否有一种方法可以使用struct简化new的初始化?我希望能够创建像

这样的行
node * lastNode = new node;
lastNode->val = *arr;
lastNode->next = NULL;
如果可能,

成一行。我知道如果我在堆栈上创建它,那么我可以做

node lastNode = { *arr, NULL m}; 

但使用new进行创建是否有等效的大括号初始化?

2 个答案:

答案 0 :(得分:2)

您尝试将node *类型分配给int *类型的变量。

节点的节点代码应为:

struct node 
{  
    T val;
    node * next;
};

对于“速记初始化”,我只使用构造函数。

class node 
{ 
    T val;
    node * next;

public:
    node(T val, node * next)
    : this->val(val)
    , this->next(next)
    {};
};

node * lastNode = new node(*arr, nullptr);

或者是c ++ 11初始化程序:

node * lastNode = new node { *arr, nullptr };

答案 1 :(得分:1)

错误在行

lastNode->next = thisNode;

错误就是

cannot convert 'SinglyLinkedList::node*' to 'int*' in assignment

我可以看到thisNode的类型为node*,并且从错误消息中我得出结论:nextint*类型的成员变量。

因此,该声明是错误的,或者您将node*指定给next的想法是错误的。

关于你的第二个问题(实际上应该是一个不同的问题,而不是一次提出两个问题),你可以给你的结构构建一个,或者升级到C++11并做new node{*arr, nullptr}