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()
// ...
这是因为=
符号也可以用于初始化。在您的示例中,您没有初始化数据成员 width
和 height
,而是为它们赋值。
【讨论】:
哇,这么微妙的问题。从来没有注意到。+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没有命名类型”错误的主要内容,如果未能解决你的问题,请参考以下文章