2

我正在尝试创建一个简单的基类和另一个继承自它的类。我收到以下错误。

guard_room.h:17:1: error: expected class-name before ‘{’ token

我查看了其他帖子,似乎我在某个地方有循环依赖,但我已经做了我读过的所有事情来解决它。这是我的课

基类 room.h:

#ifndef _room
#define _room

template <typename U, typename T>
class room
{
    public:

        //default constructor
        room();

        //overloaded constructor
        room(U, T);


        //getters/setters
        void set_treasure(T);
        void set_name(U);
        T get_treasure() const;
        U get_name() const;

    private:

        U name;

        //room monster
        //monster room_monster

        T treasure;

};

#include "room.tem"

#endif

继承类guard_room.h:

#ifndef _guard_room
#define _guard_room

template <typename U, typename T> class room;

template <typename U, typename T>
class guard_room : public room
{
    public:

        //default constructor
        guard_room();

        //overloaded constructor
        guard_room(U, T, T) : room(U, T);

        //battle function?
        void battle();

    private:
        T dummy;

};

#include "guard_room.tem"
#endif

我也非常困惑,我需要将基本房间类的包含放在我的继承类中。感谢您对此的帮助。

4

2 回答 2

3

首先,您的派生类需要能够看到您的基类的完整定义——您需要在派生类文件的顶部包含标题。(基类扩展了派生类,因此基类在很大程度上是派生类的一部分)

另外,房间是一个模板而不是一个类——你只能从一个具体的类继承,所以你需要指定模板参数。IE

#include "room.h"

template <typename U, typename T>
class guard_room : public room<U, T>

最后 - 您的.tem文件是否还包含标题保护?(如果没有,您也需要其中的那些以避免其他编译器错误)


另外,请注意初始化列表是构造函数定义的一部分,因此以下内容无效

    guard_room(U, T, T) : room(U, T);

如果您的构造函数定义在其他地方,那么您想要的只是

    guard_room(U, T, T);

否则,这可能就足够了

    guard_room(U u, T t1, T t2) : room(u, t1) {}
于 2012-04-22T07:07:49.643 回答
2

您在这里提供了构造函数的一半实现

//overloaded constructor
guard_room(U, T, T) : room(U, T);

如果您希望实现是内联的,则还必须添加构造函数主体。

//overloaded constructor
guard_room(U, T, T) : room<U, T>()
{ }

当构造函数的实现也包含在.tem文件头末尾的文件中时(如注释中所示),真正的解决方案是从构造函数声明中删除对基类的引用并将其留给单独的定义.

//overloaded constructor
guard_room(U, T, T);
于 2012-04-22T07:06:58.920 回答