"cannot convert 'SinglyLinkedList<int>::node*' to 'int*' in assignment compilation terminated due to -Wfatal-errors."

"cannot convert 'SinglyLinkedList<int>::node*' to 'int*' in assignment compilation terminated due to -Wfatal-errors."

错误

t.cpp: In constructor 'SinglyLinkedList::SinglyLinkedList(T*, size_t) [with T = int]': t.cpp:29: instantiated from here Line 51: error: cannot convert 'SinglyLinkedList::node*' to 'int*' in assignment compilation terminated due to -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

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

奖金问题:有没有一种方法可以用 new 简化 struct 的初始化?我希望能够制作像

这样的行
node * lastNode = new node;
lastNode->val = *arr;
lastNode->next = NULL;

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

node lastNode = { *arr, NULL m}; 

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

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

您的节点代码应该是:

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

至于 "shorthand initialization" 我会使用构造函数。

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 };

错误在线

lastNode->next = thisNode;

错误是

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

我可以看到 thisNode 的类型为 node*,从错误消息中我得出结论 nextint*.[=20 类型的成员变量=]

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

关于你的第二个问题(这真的应该是一个不同的问题,而不是一次问两个问题),你可以给你的结构一个构造函数,或者升级到 C++11 并做 new node{*arr, nullptr}.