【问题标题】:structure expected on left side of . or .* but it is a structure结构预期在 .或 .* 但它是一个结构
【发布时间】:2023-03-20 09:02:01
【问题描述】:

我在chest.contents[0] 上收到编译错误structure required on left side of . or .*,但chest 是一个结构:

class Item {
public:
    int id;
    int dmg;
};

class Chest {
public:
    Item contents[10];
};

int main() 
{
    Chest chest();

    Item item = chest.contents[0];

    return 0;
}

【问题讨论】:

  • 你的意思是说chest是一个对象,但还是错了。
  • @chris:他使用的“结构”与编译器错误消息的含义相同,意思是“作为类类型实例的对象”。是的,这种说法是错误的。
  • 这个错误是如此臭名昭著,以至于有一个标签......它被称为“最令人烦恼的解析”。
  • @BenVoigt,这很奇怪。我没有看到确切的错误,但我从未听说过称为结构的对象,除非它应该具有不同的含义。
  • @DietrichEpp:这与大多数令人烦恼的解析密切相关,但实际上并非如此。最令人头疼的解析是:T t(S()); 其中ST 是类型,S() 旨在构造一个临时对象以传递给转换构造函数。它比这更成问题,因为修复非常微妙,并且经常在代码清理工作中被删除。

标签: c++ compiler-errors most-vexing-parse


【解决方案1】:

不是,它是一个接受零参数的函数。

要默认初始化变量,请使用

Chest chest;

在 C++11 中,此语法可用于值初始化。

Chest chest{};

在 C++03 中,这需要一个复杂的(由于许多编译器错误)解决方法,幸好 Boost 库使它易于使用:

boost::value_initialized<Chest> chest;

【讨论】:

  • 也称为most vexing parse
  • @Bitmask:不是。您是否阅读了问题下的 cmets?还是你的链接?
  • @BenVoigt:这取决于你如何量化烦恼。我想说的是,在 2011 年之前,这更令人烦恼,因为正如你所说,它需要奇怪的魔法来解决,而不是简单的一对括号。这些天来,他们和彼此一样令人烦恼。
  • @BenVoigt:现在我做到了。就我而言,这是同样的现象。用于表示默认构造函数调用的括号被解释为函数声明中(可能为空)形式参数的括号。
【解决方案2】:
Chest chest();

不像你想象的那样,是对构造函数的调用

Chest::Chest();

而是函数的声明。创建chest 的正确方法是

Chest chest;

只有当你定义了带参数的构造函数时,你才应该使用括号。

string s;
string s2("Hello");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    相关资源
    最近更新 更多