C++ 错误:在‘;之前应为类名;{&x2019;带模板的令牌

C++ 错误:在‘;之前应为类名;{&x2019;带模板的令牌,c++,templates,inheritance,C++,Templates,Inheritance,我试图创建一个简单的基类和从中继承的另一个类 guard_room.h:17:1:错误:在“{”标记之前应该有类名 我看过其他帖子,似乎我在某个地方有一个循环依赖,但我已经做了我读过的所有事情来解决它 基本教室。h: #ifndef _room #define _room template <typename U, typename T> class room { public: //default constructor room();

我试图创建一个简单的基类和从中继承的另一个类

guard_room.h:17:1:错误:在“{”标记之前应该有类名

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

基本教室。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
#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
\ifndef\u房间
#定义房间
样板
教室
{
公众:
//默认构造函数
房间();
//重载构造函数
房间(U,T);
//能手/二传手
无效集(T);;
无效集合名称(U);
得不到宝藏;
U get_name()常量;
私人:
U名称;
//房间怪兽
//怪物房间
珍宝;
};
#包括“room.tem”
#恩迪夫
继承的班级警卫室。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
#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
\ifndef\u警卫室
#定义警卫室
模板教室;
样板
班级警卫室:公共房间
{
公众:
//默认构造函数
警卫室();
//重载构造函数
警卫室(U,T,T):警卫室(U,T);
//战斗功能?
无效战斗();
私人:
T型假人;
};
#包括“警卫室.tem”
#恩迪夫

在继承的类中,我还完全搞不清楚基类room类的include应该放在哪里。感谢您的帮助。

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

//overloaded constructor
guard_room(U, T, T) : room(U, T);
如果希望实现是内联的,那么还必须添加构造函数体

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

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

//overloaded constructor
guard_room(U, T, T) : room(U, T);
如果希望实现是内联的,那么还必须添加构造函数体

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

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

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

#include "room.h"

template <typename U, typename T>
class guard_room : public room<U, T>
如果您的构造函数定义在别处,那么您只需要

    guard_room(U, T, T);
否则,它可能就足够写了

    guard_room(U u, T t1, T t2) : room(u, t1) {}

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

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

#include "room.h"

template <typename U, typename T>
class guard_room : public room<U, T>
如果您的构造函数定义在别处,那么您只需要

    guard_room(U, T, T);
否则,它可能就足够写了

    guard_room(U u, T t1, T t2) : room(u, t1) {}

啊,我明白你的意思了,但是在我的
警卫室.tem
中我有以下构造函数
模板警卫室::警卫室(U new_name,T amount,T new_dum):room(new_name,amount){this->dummy=new_dum;}
好的,那么你应该删除
:room(U,T)
从标题开始。任何一种方法都可以。Justin现在删除的答案提出了一个重要的观点:ctor初始值设定项列表需要实际参数,而不是类型。@BenVoigt-是的,我刚刚注意到了这一点。无论如何,这都不管用,因为后面还包括了实际的实现。+1指出了我在构造函数方面的错误。谢谢你的帮助你的帮助。啊,我知道你在说什么,但是在我的
警卫室.tem
我有以下构造函数
模板警卫室::警卫室(新名称,T金额,T新金额):房间(新名称,金额){this->dummy=new\U dum;}
好的,那么你应该删除
:房间(U,T)
从标题开始。任何一种方法都可以。Justin现在删除的答案提出了一个重要的观点:ctor初始值设定项列表需要实际参数,而不是类型。@BenVoigt-是的,我刚刚注意到了这一点。无论如何,这都不管用,因为后面还包括了实际的实现。+1指出了我在构造函数方面的错误。谢谢你的帮助您的帮助。谢谢您的帮助。模板继承的特殊语法是我以前没有处理过的。我已经编辑了帖子中其他答案的帖子(Justin和Ben)为了指出初始化列表中的错误。感谢您的帮助。模板继承的特殊语法是我以前没有处理过的。我已经编辑了帖子中其他答案(Justin和Ben)的帖子,以指出初始化列表中的错误。