获取模板基类的类型

时间:2013-02-07 10:58:21

标签: c++ templates inheritance

下一个代码工作正常(这是我的其他问题的过度简化版本,类型更长,更深,更多模板):

template<class C>
struct Base
{};

template<class C>
struct Derived : public Base<C>
{
   Derived() : Base<C>()
   {}
};

但是,如果不“编写”其基类的完整类型,我怎么能调用基类构造函数?例如,我尝试过类似的东西:

template<class C>
struct Base
{
   typedef Base base_type;
};

template<class C>
struct Derived : public Base<C>
{
   Derived() : base_type() {}
};

int main()
{
   Derived<void> b;
}

但是无法识别“base_type”。 gcc抛出的消息是:

test3.cpp: In constructor 'Derived<C>::Derived()':
  test3.cpp:100:17: error: class 'Derived<C>' does not have any field
  named 'base_type'

要解决这个问题,我必须在构造函数中编写Base<C>::base_type,但这会使base_type本身的存在无关紧要。

是不是我的写作保存活动不可能?

并且,为什么找不到构造函数中的base_type,但是这样可以正常工作?

int main()
{
   Derived<void>::base_type b;
}

编辑:使用@Jack Aidley的评论,我发现使用简单别名获取基类类型的最佳格式为:

template<typename C> struct Base {};

template<typename C, typename Base>
struct Derived_impl : public Base
{
    Derived_impl() : Base()
    {}
};

template<typename C>
using Derived = Derived_impl<C, Base<C> >;

int main()
{
   Derived<void> b;
}

2 个答案:

答案 0 :(得分:2)

根据标准

  

查找模板中使用的名称声明时   定义,通常的查找规则(3.4.1,3.4.2)用于   非独立名称。查找依赖于模板的名称   参数被推迟,直到知道实际模板参数   (14.6.2)。

这意味着,您必须告诉编译器,base_type类中的Base取决于C。例如,您可以使用:

template<class C>
struct Derived : public Base<C>
{
    using typename Base<C>::base_type;

    Derived() : base_type() {}
};

或者

template<class C>
struct Derived : public Base<C>
{
    Derived() : Derived<C>::base_type() {} 

    // or, as you already told, Base<C>::base_type()
};

答案 1 :(得分:2)

您可以随时执行此操作:

template<class C>
struct Base
{
};

template<class C>
struct Derived : public Base<C>
{
   typedef Base<C> base_type;  // define here

   Derived() : base_type() {}
};

如果您要引用Derived ...

中的基本类型,则会有意义