template <typename T>
class Base
{
private:
typename T::B c;
};
class A : public Base<A>
{
public:
class B;
};
这样的事情可能吗?VC ++ 2013说B不是A的成员。
我会这样(直播示例):
template<typename T> struct Impl;
template<typename T> struct Nested;
template <typename T>
class Base
{
private:
typename Nested<T>::type c;
};
struct A;
template<> struct Impl<A> { class B { }; };
template<> struct Nested<A> { using type = typename Impl<A>::B; };
struct A : Base<A>, Impl<A>
{
//...
};
在这里,classImpl
包含A
不依赖于的部分Base
,即嵌套class B
。因此A
现在导出Base<A>
和Impl<A>
。
类Nested
仅包含一个别名,用于指定上述嵌套类的类型。现在,Base
从该类型读取此类型Nested
并定义其数据成员。
我们需要声明A
我们专门之前Impl
和Nested
它。在定义之前,我们需要那些专门知识,A
因为此时Base<A>
已实例化,并且这需要Nested<A>
完整,而又需要Impl<A>
完整。
与Philip的答案的主要区别在于责任更加分离:
Base
不会产生任何东西,因此被污染的可能性较小。我们仅将其数据成员的类型更改为typename Nested<T>::type
。
Nested
是纯类型特征。它仅定义alias type
,仅此而已。
Impl
是一个实现类。它包含嵌套类的定义,B
或者可能包含任何不依赖的内容Base
。
顺便说一下,Stroustrup的C ++编程语言的第四版在771页上具有以下代码:
template<typename N>
struct Node_base : N::balance_type { };
template<typename Val, typename Balance>
struct Search_node : Node_base<Search_node<Val, Balance> >
{
using balance_type = Balance;
};
有完全相同的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句