使用父模板中的子内部类

时间:2014-06-11 01:25:49

标签: c++ visual-studio templates

我有一个A类,它派生自一个类模板B.A有一个内部类,B需要使用,如果它不能,那么设计没有实际意义。

template <typename child_t>
class B {
    typename child_t::inner_t& some_func();
};

class A : public B<A> {
public:
    class inner_t { };
};

然而,当我尝试这样做时,编译器告诉我A没有名为inner_t的成员。我的第一个猜测是,这是因为A只是部分定义,但这种模式一直在使用。有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:1)

有几种方法可以解决这个问题。

  1. 制作BA并非必须从中获取。

    template <typename child_t>
    struct B1 {
    
        typedef typename child_t::inner_t inner_t;
    
        inner_t foo()
        {
           return inner_t();
        }
    };
    
    struct A1 
    {
       struct inner_t {};
    };
    

    然后,您可以像:

    一样使用它
    B1<A1> obj1;
    A1::inner_t inner = obj1.foo();
    
  2. 在进行函数调用之前,不要依赖A的定义。

    template <typename child_t>
    struct B2 {
    
        void foo()
        {
           typedef typename child_t::inner_t inner_t;
           // Do something with inner_t()
        }
    };
    
    struct A2 : public B2<A2>
    {
       struct inner_t {};
    };
    

    然后,您可以像:

    一样使用它
    B2<A2> obj2;
    obj2.foo();