编译器给出的错误:“不命名一个类型”立即宣布后
问题描述:
我有一个代码块从我的项目中用ncurses构建一个C++ roguelike。我试图让玩家可以握住两把武器。我已经创建了一个weaponItem类和两个对象,但是编译器仍然会抛出'不会命名类型'的错误。编译器给出的错误:“不命名一个类型”立即宣布后
代码:
weaponItem weapon1;
weaponItem weapon2;
weapon1.setType(DMW_DAGGER);
weapon2.setType(DMW_SBOW);
weapon1.setPrefix(DMWP_AVERAGE);
weapon2.setPrefix(DMWP_RUSTY);
编译器错误:
In file included from main.cpp:2:0:
hero.h:17:2: error: ‘weapon1’ does not name a type
weapon1.setType(DMW_DAGGER);
^
hero.h:18:2: error: ‘weapon2’ does not name a type
weapon2.setType(DMW_SBOW);
^
hero.h:20:2: error: ‘weapon1’ does not name a type
weapon1.setPrefix(DMWP_AVERAGE);
^
hero.h:21:2: error: ‘weapon2’ does not name a type
weapon2.setPrefix(DMWP_RUSTY);
^
有什么问题我的类或对象的声明?
答
我想你是误解了错误信息和一些评论。
假设你有一个类/结构。
struct Foo
{
Foo() : a(0) {}
void set(int in) { a = 10; }
int a;
};
您可以在函数定义的外部定义Foo
类型的对象。
// OK
Foo foo1;
但是,您不能自己调用函数定义之外的类的成员函数。
// Not OK in namespace scope or global scope.
foo1.set(20);
您可以在文件中的函数定义中进行函数调用。
// OK.
void testFoo()
{
foo1.set(20);
}
如果您使用其返回值来初始化另一个变量,则可以在函数定义之外调用成员函数。
struct Foo
{
Foo() : a(0) {}
void set(int in) { a = 10; }
int get() { return a; }
int a;
};
// OK
Foo foo1;
int x = foo1.get();
+0
这清理了很多。我忘了我试图在主函数之外执行代码。感谢解释它,但我仍然不得不问为什么我的函数必须嵌套在另一个? –
您不能在名称空间范围内执行代码。 –
weaponItem类型是在另一个头文件中声明的,这个头文件包含在我展示的文件的顶部。 –
你不能在头文件中放置可执行代码(比如'weapon1.setType(DMW_DAGGER);')。 C++中的可执行代码必须在函数中。 –