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)的帖子,以指出初始化列表中的错误。