0

我收到了一些源自我的 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;
    }
}
4

2 回答 2

0

这种情况看起来像是您的某种误解和编译器错误的结合。

正式声明

 List(tempPtr);

必须由编译器解释为声明

 List tempPtr;

语言规范在 6.8 (C++03) 中明确指出声明和函数转换表达式之间的歧义必须以赞成或声明的方式解决。这意味着您所拥有的是对 variable 的非法重新声明tempPtr。您tempPtr之前已经用不同的类型声明过。

但是,编译器发出的错误消息似乎表明编译器将其解释为函数转换表达式(而不是声明)。此表达式尝试List从 type 的指针创建tempPtr类型的无名临时对象Node *。然后立即销毁该临时对象(如果成功创建)。但是,类List没有可以从Node *指针构造它的构造函数。这就是编译器告诉你的。您的类List只有一个单参数构造函数,它采用const List &,而您提供了Node *. 编译器告诉您它无法转换Node *List调用该构造函数。

尽管如此,无论人们如何解释该语句(表达式或声明),它在您的代码上下文中都是没有意义的。无论哪种情况,它都被破坏了。所以,基本上,问题是:你到底想用这List(tempPtr);条线做什么?你的意图是什么?

第二个错误可能是由第一个错误引起的。

于 2013-08-12T02:25:07.500 回答
0

这里有几个问题。首先,C2040 和 C2440 类型相同。根据我在此讨论中发现的内容,声明中允许使用括号,因此声明:

List(tempPtr);

显然等同于:

List tempPtr;

因此,错误是一种非常令人困惑的方式,表示您重新声明了变量tempPtr,并且您给了它不同的类型。但请注意,如果你写了List*(tempPtr)它会说redefinition: different basic types, 所以它似乎也与这样一个事实有关,即List它不像指针那么多Node*(这就是“间接级别”位的来源)。C2440 由于重新声明而发生。您可以通过注释掉List(tempPtr);并查看代码是否可以编译来确认这一点。然而,它会编译的事实并不是说它在任何方面都是正确的。

问题 #2 是你没有在这里显示一个构造函数Node*,即使你有一个,这也不是调用它的正确方法。我不完全确定您要对此做什么。

问题 #3 是您正在Node疯狂地泄漏对象。当您执行这些行时:

Node* tempPtr = new Node;
tempPtr = theList.first;

Node* copyNode = new Node;
copyNode = tempPtr;

您正在分配Node对象,然后丢弃指向它们的指针。如果您试图复制Node对象,那不是这样做的方法。你也需要一个复制构造函数。

这不是您的List类的正确复制构造函数的所有内容,但它涵盖了您发布的代码的一些最大问题,尤其是这似乎是您遇到这两个错误的原因。

于 2013-08-12T01:25:13.333 回答