c++ - 使用基类的派生类中定义的类型

标签 c++ templates

我有一个纯虚拟模板基类,我在其中定义了一个方法 get_value,它接受一个枚举并返回一个 int。复杂的是每个派生类将使用不同的枚举。如果我只是预先定义枚举并将它们作为模板参数传递给基类,这不是问题,但是,由于枚举类型与派生类型直接相关,我希望在派生类中定义枚举。

我希望通过让基类将派生类作为参数然后访问派生类的枚举来解决这个问题,如下所示:

template <typename child_type>
class base_type{
public:
    int get_value(typename child_type::enum_type);
};

class child : public base_type<child>{
public:
    enum enum_type{a,b,c};
};

MinGW 报告

test.cpp: In instantiation of 'class base_type<child>':
test.cpp:7:22:   required from here
test.cpp:4:6: error: invalid use of incomplete type 'class child'
  int get_value(typename child_type::enum_type index);
      ^~~~~~~~~
test.cpp:7:7: note: forward declaration of 'class child'
 class child : public base_type<child>{
       ^~~~~

我理解错误;我只是觉得应该有一种方法可以做我想做的事情,并且无法在不变得太复杂的情况下围绕如何去做。这可能吗,还是我的做法不对?

至于我的问题的细节:这些类解析一个记录文件,该文件可以用几种不同的编码版本之一进行编码 - 版本之间的处理基本相同,并且可以在非虚拟库中完成批量处理函数,调用虚函数来做特定于版本的事情。不同的版本也会提取略有不同的值名称,我试图在特定于版本的枚举中捕获这些名称。每个命名值在记录中的位置将存储在相应枚举成员值的值中。

可能有更好的方法来解决这个问题,但我还没想到。我想在这种情况下我可以让 get_value 在基类中取一个 int,使用子类枚举进行调用,然后让转换发生,但我希望看看基类的更一般情况是否使用在 child 中定义的类型是可能的。

最佳答案

我能想到的最佳解决方案是使用子特征。

template <typename child_type>
class base_type{
public:
    int get_value(typename child_type::enum_type);
};

struct child_traits {
enum enum_type{a,b,c};
};
class child : 
public child_traits, 
public base_type<child_traits>{

};

关于c++ - 使用基类的派生类中定义的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46499277/

相关文章:

templates - Eclipse CDT "New Class"模板

c++ - 如果无法编译未使用的函数,则模板类使用 C++17 编译,但不使用 C++20

c++ - 项目符号:btBvhTriangleMeshShape 崩溃

c++ - 如何在不使用对象的情况下调用父类成员函数内的子成员函数

c++ - 为什么不调用子类方法?

c++ - 如何typedef未参数化模板?

c++ - CRTP 和方法返回 void *

c++ - __forceinline 和内联用法

c++ - 我如何询问一个对象是否属于类 x?

C++ 将模板类传递给 void 函数