Copy-Constructor - 编译器错误C2040和C2440

时间:2013-08-11 19:06:27

标签: c++ compiler-errors copy-constructor

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

2 个答案:

答案 0 :(得分:0)

这里有几个问题。首先,C2040和C2440类型相同。根据我发现的in this discussion,在声明中允许使用括号,所以声明:

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类的正确复制构造函数的所有内容,但它涵盖了您发布的代码的一些最大问题,特别是这似乎是您获取这些代码的原因两个错误。

答案 1 :(得分:0)

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

正式声明

 List(tempPtr);

必须由编译器解释为声明

 List tempPtr;

语言规范明确规定在6.8(C ++ 03)中,声明和功能演员表达之间的歧义必须以有利或声明来解决。这意味着你所拥有的是变量tempPtr的非法重新声明。您之前已使用其他类型声明了tempPtr

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

但是,无论人们如何解释该语句(表达式或声明),在代码的上下文中都没有意义。在任何一种情况下都会被打破。所以,基本上,问题是:你试图用List(tempPtr);线做什么?你的意图是什么?

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