我收到了一些编译器错误,这些错误源于我的Copy-Constructor。我知道第一个错误是由于不兼容的操作数类型造成的,我只是不确定有没有更好的方法来写那段代码。第二个错误我一点也不确定。为什么'='不能从Node*转换到Node*?
任何帮助或指示都会得到重视。
谢谢!
// Copy-Constructor
List::List(const List& theList)
{
Node* tempPtr = new Node;
tempPtr = theList.first;
//error C2040: 'tempPtr' : 'List' differs in levels of indirection from 'Node *'
List(tempPtr);
while (tempPtr != NULL)
{
Node* copyNode = new Node;
//error C2440: '=' :cannot convert from 'Node *' to 'Node *'
copyNode = tempPtr;
tempPtr = tempPtr->getNext();
nodeListTotal++;
}
}下面是我的构造函数和析构函数。
List::List():first(0), last(0), nodeListTotal(0)
{
}
// Destructor
List::~List()
{
Node* currentNode = first;
while(currentNode != NULL)
{
Node* temp = currentNode;
currentNode = currentNode->getNext();
delete temp;
}
}发布于 2013-08-12 09:25:13
这里有几个问题。首先,类型是相同类型的C2040和C2440。根据我找到的in this discussion,声明中允许使用括号,所以语句:
List(tempPtr);显然等同于:
List tempPtr;因此,错误是一种非常令人困惑的方式,即您重新声明了变量tempPtr,并为其指定了不同的类型。但请注意,如果您编写的是List*(tempPtr),它将显示为redefinition: different basic types,因此这似乎也与List不像Node*那样是一个指针的事实有关(这就是“间接寻址级别”位的来源)。C2440是由于重新声明而发生的。您可以通过注释掉List(tempPtr);并查看代码将被编译来确认这一点。然而,它可以编译的事实并不意味着它是正确的。
第二个问题是,你没有在这里显示一个接受Node*的构造函数,即使你有一个,那也不是正确的调用方式。我不太清楚你想用它做什么。
问题#3是你疯狂地泄露了Node对象。当您执行这些行时:
Node* tempPtr = new Node;
tempPtr = theList.first;和
Node* copyNode = new Node;
copyNode = tempPtr;您正在分配Node对象,然后丢弃指向它们的指针。如果您正在尝试复制Node对象,这不是执行此操作的方法。您还需要一个复制构造函数。
这并不是List类的正确复制构造函数的全部内容,但它涵盖了您所发布的代码中的一些最大问题,尤其是这似乎是您收到这两个错误的原因。
发布于 2013-08-12 10:25:08
这种情况看起来像是您的某种误解和编译器错误的组合。
正式声明
List(tempPtr);必须由编译器解释为声明
List tempPtr;语言规范在6.8 (C++03)中明确指出,声明和函数类型转换表达式之间的歧义必须以有利于或声明的方式解决。这意味着你所拥有的是对变量tempPtr的非法重声明。您之前已经用不同的类型声明了tempPtr。
但是,编译器发出的错误消息似乎表明编译器将其解释为函数类型转换表达式(而不是声明)。此表达式尝试从类型为List的指针tempPtr创建类型为Node *的无名临时对象。然后,该临时对象(如果成功创建)将立即销毁。但是,类List没有可以从Node *指针构造它的构造函数。这就是编译器告诉你的。您的类List只有一个单参数构造函数,它接受const List &,而您提供了一个Node *。编译器告诉您,它无法将Node *转换为List来调用该构造函数。
尽管如此,无论如何解释该语句(表达式或声明),它在您的代码上下文中都没有任何意义。不管是哪种情况,它都是坏的。所以,基本上,问题是:你到底想用那条List(tempPtr);线做什么?你的意图是什么?
第二个错误可能是由第一个错误引起的。
https://stackoverflow.com/questions/18175650
复制相似问题