所以我为Weapon类的这些构造函数提供了这个代码:
Weapon(const WeaponsDB * wepDB);
Weapon(const WeaponsDB * wepDB_, int * weaponlist);
~Weapon(void);
我一直收到错误:
1>c:\users\owner\desktop\bosconian\code\bosconian\weapon.h(20) : error C2062: type 'int' unexpected
以及随之而来的错误(超过列出的内容):
1>c:\users\owner\desktop\bosconian\code\bosconian\weapon.h(21) : error C2059: syntax error : '('
1>c:\users\owner\desktop\bosconian\code\bosconian\weapon.h(21) : error C2238: unexpected token(s) preceding ';'
1>c:\users\owner\desktop\bosconian\code\bosconian\weapon.h(33) : error C2327: '<unnamed-tag>::maxWeapons' : is not a type name, static, or enumerator
1>c:\users\owner\desktop\bosconian\code\bosconian\weapon.h(33) : error C2065: 'maxWeapons' : undeclared identifier
1>c:\users\owner\desktop\bosconian\code\bosconian\weapon.h(38) : warning C4094: untagged 'class' declared no symbols
我是一个半新手,我无法弄明白。
第21行是第二个构造函数,第一个构造函数不会导致错误。 另外,如果我注释掉这个构造函数,我仍然会在构造函数之后列出所有错误。知道问题可能是什么吗?
以上代码供参考:
#ifndef Weapon
#define Weapon
#include <allegro.h>
#include <stdio.h>
#include <iostream>
using namespace std;
class WeaponsDB;
class MenuDriver;
class Ammo;
class Weapon
{
public:
.....
答案 0 :(得分:19)
#ifndef Weapon
#define Weapon
这几乎肯定会导致奇怪;改为调用常量WEAPON_H。
答案 1 :(得分:7)
所以你将你的类命名为预处理器指令?这是我要避免的事情。
尝试更改预处理器武器或制作不同的类名。我认为它会更好。
答案 2 :(得分:5)
我认为问题出现在#define Weapon中 - 代码中稍后出现的“武器”将被删除或替换为你不想要的东西。
答案 3 :(得分:4)
解释蒂姆的回答。你看到这样的代码:
#ifndef Weapon
#define Weapon
#include <allegro.h>
#include <stdio.h>
#include <iostream>
using namespace std;
class WeaponsDB;
class MenuDriver;
class Ammo;
class Weapon
{
public:
Weapon(const WeaponsDB * wepDB);
Weapon(const WeaponsDB * wepDB_, int * weaponlist);
~Weapon(void);
}
但是您已将预处理器宏Weapon
定义为空字符串,因此编译器会看到:
#ifndef Weapon
#define Weapon
#include <allegro.h>
#include <stdio.h>
#include <iostream>
using namespace std;
class sDB;
class MenuDriver;
class Ammo;
class
{
public:
(const sDB * wepDB);
(const sDB * wepDB_, int * weaponlist);
~(void);
}
只需更改包含保护以使用不作为名称出现的字符串(例如WEAPON_H_INCLUDED
)。
答案 4 :(得分:2)
与其他已经提供的答案一样,我也怀疑预处理器指令。
要确认,比如GCC,您可以请求它只运行预处理器并将输出保存在某处。您可能使用的编译器具有类似的功能。
答案 5 :(得分:0)
我不知道这是否是微软特有的(我最近才使用过VS2005),但是这样可行。我使用以下命令启动所有头文件:
#pragma once
答案 6 :(得分:0)
GCC还支持“#pragma once”,但它不是标准的,如果你使用传统的包含守卫#ifndef _MYFILE_H_或某些变体,代码将更具可移植性。
答案 7 :(得分:-1)
快速说明:在C ++中,与C不同,当函数(或析构函数,在本例中)没有任何参数时,您不需要使用(void),只需使用()。 / p>