首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复制-构造函数-编译器-错误C2040和C2440

复制-构造函数-编译器-错误C2040和C2440
EN

Stack Overflow用户
提问于 2013-08-12 03:06:27
回答 2查看 290关注 0票数 0

我收到了一些编译器错误,这些错误源于我的Copy-Constructor。我知道第一个错误是由于不兼容的操作数类型造成的,我只是不确定有没有更好的方法来写那段代码。第二个错误我一点也不确定。为什么'='不能从Node*转换到Node*?

任何帮助或指示都会得到重视。

谢谢!

代码语言:javascript
复制
// 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++;
    }
}

下面是我的构造函数和析构函数。

代码语言:javascript
复制
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;
    }
}
EN

回答 2

Stack Overflow用户

发布于 2013-08-12 09:25:13

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

代码语言:javascript
复制
List(tempPtr);

显然等同于:

代码语言:javascript
复制
List tempPtr;

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

第二个问题是,你没有在这里显示一个接受Node*的构造函数,即使你有一个,那也不是正确的调用方式。我不太清楚你想用它做什么。

问题#3是你疯狂地泄露了Node对象。当您执行这些行时:

代码语言:javascript
复制
Node* tempPtr = new Node;
tempPtr = theList.first;

代码语言:javascript
复制
Node* copyNode = new Node;
copyNode = tempPtr;

您正在分配Node对象,然后丢弃指向它们的指针。如果您正在尝试复制Node对象,这不是执行此操作的方法。您还需要一个复制构造函数。

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

票数 0
EN

Stack Overflow用户

发布于 2013-08-12 10:25:08

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

正式声明

代码语言:javascript
复制
 List(tempPtr);

必须由编译器解释为声明

代码语言:javascript
复制
 List tempPtr;

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

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18175650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档