初始化时无法将对象转换为对象*?

时间:2017-02-27 21:18:14

标签: c++ object linked-list

我正在尝试编写一个将新节点插入到我的链表中的函数。我已将该函数定义为:

template <typename T>
void InsertNode(node<T>* front, const T & value)
{
node<T>* newNode = CreateNode(value);

// if the list is empty or if insert in front of front  
if (front == NULL || front->nodeValue >= newNode->nodeValue) {
    newNode->next = front;
    front = newNode;
}
else
{
     //Locate the node before the point of insertion 

    node<T>* curr = front;
    while (curr->next != NULL && curr->next->nodeValue < newNode->nodeValue)
    {
        curr = curr->next;
    }
    newNode->next = curr->next;
    curr->next = newNode;
}

}

我用以下方法调用此函数:

InsertNode(first, c);

CreateNode的定义:

template <typename T>
node<T> CreateNode(const T & value)
{
    return new node<T>(value);
}

我收到一条错误消息(用g ++编译时):

main.cpp: In instantiation of ‘void InsertNode(node<T>*, const T&) [with T = Course]’:
main.cpp:143:23:   required from here
main.cpp:248:37: error: cannot convert ‘node<Course>’ to ‘node<Course>*’ in initialization
  node<T>* newNode = CreateNode(value);
                                     ^
main.cpp: In instantiation of ‘node<T> CreateNode(const T&) [with T = Course]’:
main.cpp:248:31:   required from ‘void InsertNode(node<T>*, const T&) [with T = Course]’
main.cpp:143:23:   required from here
main.cpp:304:26: error: could not convert ‘(operator new(112ul), (<statement>, ((node<Course>*)<anonymous>)))’ from ‘node<Course>*’ to ‘node<Course>’
  return new node<T>(value);

导致此错误的原因是什么?我无法弄明白。如果需要更多代码,例如原型或其他任何代码,请告诉我。 如果有人可以提供很好的格式化帮助。

1 个答案:

答案 0 :(得分:1)

仔细阅读错误消息:

main.cpp:248:37: error: cannot convert ‘node<Course>’ to ‘node<Course>*’ in initialization
node<T>* newNode = CreateNode(value);
                                     ^
main.cpp: In instantiation of ‘node<T> CreateNode(const T&) [with T = Course]’:

显然,您的CreateNode正在返回实际对象node<T>,但您要将其分配给node<T>*

您很可能希望CreateNode充当更复杂的new,在堆上返回一个对象,即node<T>*。如果是这种情况 - 相应地改变它。我会在开始时将其重命名为newNode或带有new的内容,向用户提示,在某些时候,某人应该delete

如果您无法更改CreateNode的签名,则需要复制您获得的节点:

Node<T>* newNode = new Node<T>(CreateNode(value))

但我必须强调,如果Node<T>很大,这可能效率低下 - 你在这里复制,然后弃掉原件。当然,除非Node<T>有一个r值引用复制构造函数,否则这是另一个故事......

问题编辑后我注意到:

template <typename T>
node<T> CreateNode(const T & value)
{
    return new node<T>(value);
}

这也不应该编译! new node<T>(...)的指针类型为node<T>*,但您的函数返回的是实际对象node<T>。只需更改签名即可返回指针 - 它应该修复此错误以及您在问题中说明的错误。