【问题标题】:"Y does not name a type" error in C++C ++中的“Y没有命名类型”错误
【发布时间】:2013-06-01 02:05:39
【问题描述】:

我不知道要搜索什么才能找到对此的解释,所以我在问。
我有这个报告错误的代码:

struct Settings{
    int width;
    int height;
} settings;

settings.width = 800; // 'settings' does not name a type error
settings.height = 600; // 'settings' does not name a type error

int main(){
    cout << settings.width << " " << settings.height << endl;

但如果我将值赋值放在 main 中,它会起作用:

struct Settings{
    int width;
    int height;
} settings;

main () {
    settings.width = 800; // no error
    settings.height = 600; // no error

你能解释一下为什么吗?

编辑:
关于 Ralph Tandetzky 的回答,这是我的完整结构代码。你能告诉我如何像我的 sn-p 结构一样分配值吗?

struct Settings{
    struct Dimensions{
        int width;
        int height;
    } screen;

    struct Build_menu:Dimensions{
        int border_width;
    } build_menu;
} settings;

【问题讨论】:

标签: c++ class struct variable-assignment


【解决方案1】:

您不能将赋值放在 C++ 中函数的上下文之外。如果您对有时看到在函数上下文之外使用= 符号这一事实感到困惑,例如:

int x = 42; // <== THIS IS NOT AN ASSIGNMENT!

int main()
{
    // ...
}

这是因为= 符号也可以用于初始化。在您的示例中,您没有初始化数据成员 widthheight,而是为它们赋值。

【讨论】:

  • 哇,这么微妙的问题。从来没有注意到。+1。这里唯一缺少的是通常的标准参考。你是安迪还是其他入侵了安迪帐户的人?:-)
  • 天啊,太棒了。我也在使用初始化,所以我不明白为什么这不起作用,因为在这个结构之前我还有几个变量。所以要清楚。 int i = 5; 可以工作,但int i; 后跟i = 5; 不能工作?
  • @AndyProwl 你能否提供一些关于这个comment 的见解。基本上是关于“扩展结构”。
  • @Koushik:这个问题可能需要单独回答——我不确定我是否理解 OP 的设计,我现在没有时间考虑太多;)跨度>
  • @AndyProwl 啊,很公平,现在让你完成你的宏伟设计:-)
【解决方案2】:

在 C++11 中你可以写

struct Settings {
    int width;
    int height;
} settings = { 800, 600 };

为了修复你的错误。出现错误是因为您试图在函数体之外分配一个值。您可以在函数之外初始化但不能分配全局数据。

编辑:

关于您的编辑,请写

Settings settings = {{800, 600}, {10, 20, 3}};

我不确定 100% 是否可行,因为继承。我建议在这种情况下避免继承并将Dimensions 作为成员数据写入Build_menu 结构。用这种方式继承,迟早会给你带来各种麻烦。 Prefer composition to inheritance. 当你这样做时,它会看起来像

Settings settings = {{800, 600}, {{10, 20}, 3}};

【讨论】:

  • 这个也可以写struct Settings { int width = 10; int height = 20; } settings;
  • 哦,谢谢,关于这个,我还有一个问题。我发布的结构只是我真实结构的一个 sn-p。我会更新我的问题,你会这么好心,看看我怎么能用这个assignmenet让它工作?我在 main.cpp 的开头定义了我的结构(当然是在包含之后),所以这是在我的代码中看到的第一件事。这就是为什么我更喜欢这样的赋值,而不是在第 300 行的 main() 中。
  • @Qwerty 这只是初始化。这些将您的结构设置为某个初始值,以便您了解这些成员的状态。之后您可以在程序中进行相应更改。\
  • @Koushik 我编辑了问题,以便您可以看到我的完整结构代码。由于我在结构中扩展结构,我将如何按照您的建议分配值?另外我不太喜欢 struct Build_menu build_menu 的东西。有没有办法只用一个选项来扩展 build_menu 而不是为它创建一个结构?
  • @Qwerty assign 正如我所展示的那样简单,但仅适用于 c++11 模式。拉尔夫的方法也可以应用,但你必须在大括号初始化中有大括号。就 build_menu 而言,如果您想“扩展”它,没有其他选择。这也取决于你的设计。
猜你喜欢
  • 2015-12-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
相关资源
最近更新 更多