在CRTP中访问内部类(在C ++中)

时间:2013-11-09 07:08:21

标签: c++ inner-classes crtp

以下最小示例无法编译。

template<class T>
class Base1 {};

template<class Impl>
class Base2 : public Base1<typename Impl::Inner> {}; // line 5

struct C : public Base2<C> // line 7
{
    class Inner;
};

int main()
{
    C c;
    (void)c;
    return 0;
}

错误:

> g++ -std=c++11 -Wall incomplete.cpp -o incomplete
incomplete.cpp: In instantiation of ‘class Base2<C>’:
incomplete.cpp:7:19:   required from here
incomplete.cpp:5:7: error: invalid use of incomplete type ‘struct C’
incomplete.cpp:7:8: error: forward declaration of ‘struct C’

但是,现在用这个代替Base2的代码:

template<class Impl>
class Base2
{
    struct BaseInner : public Base1<typename Impl::Inner> {};
};

为什么(确切地)现在不会发生错误?我可以在第一个代码示例中摆脱错误吗?

注意:下面的代码当然有用,但是缺点是每次我想要构造像C这样的类时我都需要继承两次。我希望有一个解决方案,在给Base2一个模板之前一切都已完成。

template<class Impl>
class Base2
{
    struct BaseInner : public Base1<typename Impl::Inner> {};
};

struct _C : public Base2<_C> // line 7
{
    class Inner {};
};

struct C : public _C, _C::Inner
{
};

0 个答案:

没有答案