2012-02-07 89 views
0

我正在使用Code :: Blocks和Mingw32与SDL库。该错误出现在我的代码的第13行(下面评论)。错误:多个类型在一个声明中

经过一番搜索,我相信它是一个缺少分号(;),但这似乎并不是这种情况。额外的研究发现它可能是一个包含文件中的错误。

不幸的是,include中没有错误,甚至当include被注释掉时,这个错误依然存在。当enum块被注释掉时,错误会跳转到类声明的末尾。

#ifndef _TILE_H_ 
#define _TILE_H_ 

#include "Define.h" 

enum 
{ 
    TILE_TYPE_NONE = 0, 
    TILE_TYPE_GROUND, 
    TILE_TYPE_RAMPUP, 
    TILE_TYPE_RAISED, 
    TILE_TYPE_RAMPDOWN 
}; //error occurs here (line 13) 

class Tile 
{ 
public: 
    int TileID; 
    int TypeID; 

public: 
    Tile(); 
}; 

#endif 

这实际上开始添加一个新的类之后发生的事情,但是新类是完全不相关的,并且不使用,包括或从一个贴在所有的继承。

任何意见或信息将非常感激。

编辑(添加Define.h):

#ifndef _DEFINE_H_ 
#define _DEFINE_H_ 

#define MAP_WIDTH 40 
#define MAP_HEIGHT 40 

#define TILE_SIZE 16 

#define WINDOW_WIDTH 640 
#define WINDOW_HEIGHT 480 

#endif 
+2

你是不是想给你的'enum'一个名字? (例如'enum e_tile_type {/*...*/};') – Johnsyweb 2012-02-07 00:55:34

+1

寻找包含文件的问题 – Anycorn 2012-02-07 00:57:16

+0

编译器给你的错误信息是什么? – Pochi 2012-02-07 00:58:34

回答

8

你有这样的文件:

#include "Something.h" 
#include "Tile.h" 

Something.h,你有这样的:

class Something { 
    // ... 
} 

你缺少一个分号,所以编译器看到:

class Something { 
    // ... 
} 
enum { 
}; 

这是一个包含两种类型的声明(一个class和一个enum),这是不允许的。分号class后需要structenum因为你可以在相同的声明作为类型声明一个新类型的实例:

struct Point { int x; int y; } my_point; 

(另外,从_名和一个大写字母被保留使用TILE_H而不是_TILE_H_。)

+0

就是这样,很多英里以外的地方都有一个缺失的分号,它把所有的东西都扔掉了。谢谢你的解释。 – TechRomancer 2012-02-08 15:42:52

+0

@TechRomancer:我的荣幸。我在书中犯了每一个C++错误。 :P – 2012-02-08 15:48:46

1

当我注释掉包括用于Define.h,这个代码编译细我使用克++对。这表明,如您所建议的那样,包含文件中可能确实存在问题。也许你在Define.h末尾的某处丢失了一个分号,或者在那里有一些其他的语法问题。

+0

我编辑的帖子也包含了Define.h。对于我来说,当include在Tile.h中被注释掉时,编译器仍会抛出相同的错误。 – TechRomancer 2012-02-07 01:07:06

+0

是的,它在Define.h中看起来没有问题。但是,它只包含宏,没有代码,所以也许问题实际上出现在Tile.h之前的代码中。您可以尝试编译Tile.h包含在“gcc -E”或等效文件中的文件,以查看预处理器输出。 – 2012-02-07 14:50:46

0

我叫你的第一个文件Tile.h创造Tile.cpp如下:

#include "Tile.h" 

Tile::Tile() 
{ 
} 

int main() 
{ 
    return 0; 
} 

然后我编译Ubuntu Linux上使用g ++:

$ g++ Tile.cpp -o Tile

我收到既不是编译也不是运行时错误(同样为gcc)。您的问题在其他地方 - 无论是在#include d文件中,您没有向我们展示,或者某种平台特定的命名冲突。我会尝试逐步重命名,直到问题消失。

编辑:您的原始代码在这种情况下保持不变。