我正在尝试编写一个将新节点插入到我的链表中的函数。我已将该函数定义为:
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);
导致此错误的原因是什么?我无法弄明白。如果需要更多代码,例如原型或其他任何代码,请告诉我。 如果有人可以提供很好的格式化帮助。
答案 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>
。只需更改签名即可返回指针 - 它应该修复此错误以及您在问题中说明的错误。