首页 > 解决方案 > 类模板中的类范围枚举

问题描述

假设我有一个类Person,子类TeacherLawyer.

还有一个类Tool和子类TeacherTool:ToolLawyerTool:Tool

现在,每个Person都有Tool's,并且Tool有一个getToolUses返回 enum的函数Usage。IE:

enum Usage;
Person{
 Tool *Tools[];
}
Tool{
 Usage getToolUses();
}

Teacher:public Person{}
TeacherTool: public Tool{
 TeacherUsage getToolUses();
}
// etc Lawyer

现在,您不能在 C++ 中覆盖函数返回类型,但可以使用模板类来更改返回类型,如下所示:

Person{
 Tool *Tools[];
}

template <class Usage>
Tool{
 virtual Usage getToolUses();
}

enum TeacherUsage;
Teacher:public Person{}
TeacherTool: public Tool<TeacherUsage>{
 TeacherUsage getToolUses();
}
// etc Lawyer

接下来,我们只想Teachers使用TeacherTools,而不是LawyerTools,所以我们进一步扩展模板:

template <class Usage>
Person{
 Tool<Usage> *Tools[];
}

template <class Usage>
Tool{
 virtual Usage getToolUses();
}

Teacher:public Person<TeacherUsage>{}

TeacherTool: public Tool<TeacherUsage>{
 TeacherUsage getToolUses();
}
// etc Lawyer

enum TeacherUsage应该是是有道理的enum Teacher::Usage,所以我们去:

template <class Usage>
Person{
 Tool<Usage> *Tools[];
}

template <class Usage>
Tool{
 virtual Usage getToolUses();
}

Teacher:public Person<Teacher::Usage>{
  enum Usage;
}

TeacherTool: public Tool<Teacher::Usage>{
 TeacherUsage getToolUses();
}
// etc Lawyer

但是,这是行不通的,因为Teacher::Usage声明中的模板参数Teacher尚未声明。

有什么方法可以部分转发声明Teacher::Usage,以便我可以在我的模板中使用它Teacher吗?

标签: c++templatesforward-declaration

解决方案


推荐阅读