C ++中的“Y没有命名类型”错误

Posted

技术标签:

【中文标题】C ++中的“Y没有命名类型”错误【英文标题】:"Y does not name a type" error in C++ 【发布时间】: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;

【问题讨论】:

"X does not name a type" error in C++ 和 Class name does not name a type in C++ 的可能重复 @jww 虽然你的观点是正确的,但我最喜欢Andy's answer here,因为它简单。也为有趣的标题变化点赞。 【参考方案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 而言,如果您想“扩展”它,没有其他选择。这也取决于你的设计。

以上是关于C ++中的“Y没有命名类型”错误的主要内容,如果未能解决你的问题,请参考以下文章

C/C++ 混合程序中的错误 LNK2005 和错误 LNK2019

C语言编译时的错误

C中的Minishell“分段错误,核心转储”错误

如何解决列表和文件的“C”中的“分段错误”错误

C 错误处理异常,如

Dev C ++中的编译错误错误[重复]