错误:模板中的“{”标记之前的预期类名

error: expected class-name before ‘{’ token with templates

本文关键字:错误      更新时间:2023-10-16

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

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

看过其他帖子,似乎我在某处有一个循环依赖,但我已经做了我所阅读的一切来解决它。这是我的课程

基班房间.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

我也完全困惑于我需要将基室类的包含放在我继承的类中的位置。 感谢您对此的帮助。

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

此外,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) {}

您在此处提供了构造函数的一半实现

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