使用基类

时间:2017-09-30 03:19:24

标签: c++ templates

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

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

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,使用子类枚举来进行调用,然后让这个转换发生,但我希望看看基类的更一般的情况使用儿童中定义的类型是可能的。

1 个答案:

答案 0 :(得分:1)

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

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>{

};