我有一个纯虚拟模板基类,在其中定义了一个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值,使用子类的枚举进行调用,并进行强制转换,但是我希望看看基类的更一般情况使用在孩子中定义的类型是可能的。

最佳答案

我能想到的最好的解决方案是使用儿童特征。

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/

10-12 15:59