错误:带有模板的'{'标记之前的预期类名

时间:2012-04-22 06:53:42

标签: c++ templates inheritance

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

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

我也很困惑,我需要在继承的类中放置基类会的包含。感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

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

//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);

答案 1 :(得分:2)

首先,派生类需要能够查看基类的整个定义 - 您需要在派生类的文件顶部包含标题。 (基类扩展派生类,因此基类是派生类的一部分)

此外, room 是一个模板,而不是一个类 - 您只能从具体类继承,因此您需要指定模板参数。即

#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) {}