【问题标题】:Conversion from 'myItem*' to non-scalar type 'myItem' requested请求从“myItem*”转换为非标量类型“myItem”
【发布时间】:2010-10-12 23:38:44
【问题描述】:

我有这个 C++ 代码:

#include <iostream>
using namespace std;
struct MyItem
{
  int value;
  MyItem* nextItem;
};

int main() {
    MyItem item = new MyItem;
    return 0;
}

我得到了错误:

error: conversion from `MyItem*' to non-scalar type `MyItem' requested

用 g++ 编译。那是什么意思?这里发生了什么?

【问题讨论】:

    标签: c++ new-operator


    【解决方案1】:

    试试:

    MyItem * item = new MyItem;
    

    但使用后别忘了删除:

    delete item;
    

    【讨论】:

    • 我试过 *item。认为事情之间的空间? linux 服务器刚刚崩溃,我必须等待它们恢复,然后才能尝试使用 then * 和 item 之间的空格。
    • @kralco:不,没关系。你有介绍 C++ 的书吗?
    • 没有。我正在上操作系统课。我学习了大量的 Java 编程课程并使用了 C#,并且仍然在广泛地工作。然而,这些语言都没有使用像 C/C++ 这样的指针。这只是一个更大的项目的一部分,它实现了一个执行流水线的程序(即使 linux 内置了它)。我已经写完了整件事,但我得到了这个错误。
    • 对不起,如果我没有说清楚,我尝试了 MyItem *item = new MyItem 并且仍然出现错误。
    • @kralco:然后在问题中发布您的真实代码。如果你想用 C++ 编程,你应该得到a book,这不会靠猜测来实现。
    【解决方案2】:

    你已经混合了

    MyItem item;
    

    它在堆栈上分配MyItem 的实例。实例的内存在封闭范围结束时自动释放

    MyItem * item = new MyItem;
    

    在堆上分配一个MyItem 的实例。您将使用指针引用此实例,并且在使用 delete item 完成后需要显式释放内存。

    【讨论】:

      【解决方案3】:

      首先,此代码无法编译,因为您忘记了每个成员变量声明后和 MyItem 声明后的分号,并且关键字“struct”输入错误。您的代码应如下所示:

      struct MyItem
      {
      var value;
      MyItem* nextItem;
      };
      
      MyItem item = new MyItem;
      

      现在回答您的问题,此代码不起作用,因为 new 运算符返回一个指向所创建对象的指针(MyItem* 类型的值),而您正试图将此指针分配给 MyItem 类型的变量。编译器不允许您这样做(因为值和变量具有不同的类型)。您应该将指针存储到适当的变量中,如下所示:

      MyItem* item = new MyItem;
      

      在这种情况下,您必须记住delete item,以免在不再需要时发生内存泄漏。

      或者,您可以在没有new 运算符的情况下在堆栈中创建对象。

      MyItem item;
      

      在这种情况下,当函数返回时,对象不再存在;你不需要记得删除它。

      【讨论】:

        【解决方案4】:

        这是编辑后的代码,右侧提到了更改

        struct MyItem                  // corrected spelling struct
        {
            var value;                 // added ;
            struct MyItem * nextItem;  // add "struct" and added ;
        };                             // added ;
        
        MyItem * item = new MyItem;    // added * before item
        
        delete item;                   // not exactly here, but some where in your code
        

        顺便说一句,你不必必须new。您可以在堆栈上创建一个MyItem 对象

        MyItem anotherItem;
        

        【讨论】:

        • 是的,但要求是我们使用新的 :(。一旦大约 30 分钟前崩溃的 linux 服务器恢复正常,我会尝试一下。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-22
        • 1970-01-01
        • 1970-01-01
        • 2015-12-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多