2

以下最小示例无法编译。

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
{
};
4

0 回答 0