2

鉴于:

template <...>
class InheritedByManyClasses
{
public:
    typedef InheritedByManyClasses<...> ParentClass;
};

如果我让一个孩子成为更多班级的父母,没有办法将这个想法联系在一起?

template<...>
class ChildInheritedByMany : InheritedByManyClasses<...>
{
public:
    typedef ... ParentClass;  // oops!  now this class can't benefit from parent typedef
};

有什么方法可以在孩子身上制作一个只对其typedef孩子可见的孩子吗?

4

4 回答 4

5
using

template<typename T>
struct A {
  protected:
    using V = std::vector<T>;   
};

template<typename T>
struct B : A<T> {
  protected:
    typename A<T>::V i;
  public:
    using A<T>::V;  // If you want to make it public now

};

int main() { 
    // A<int>::V i;  // Not visible
    B<int>::V i;  // visible
}
于 2013-05-16T21:32:58.697 回答
2

制作protected并按typedef顺序放入孩子:

struct A
{
};

struct B : public A
{
protected:
    typedef A Parent;
};

struct C : public B
{
protected:
    typedef B Parent;
};
于 2013-05-16T21:37:00.817 回答
1

不,没有。所有成员始终对当前类可见。但是,有一个简单的解决方法:

template<typename T>
struct base_typedef_shim : T
{
     typedef T ParentClass;

     // the usual C++11 perfect constructor forwarding stuffs
};

template <...>
class InheritedByManyClasses
{
};

template<...>
class ChildInheritedByMany : public base_typedef_shim<InheritedByManyClasses<...>>
{
};

template<...>
class GrandChild : public base_typedef_shim<ChildInheritedByMany<...>>
{
};
于 2013-05-16T21:56:24.803 回答
1

您可以将其typedef放入子类中:

template<...>
class ChildInheritedByMany : InheritedByManyClasses<...>
{
public:
    typedef InheritedByManyClasses<...> ParentClass;
};

此外,根据您的用例,std::is_base_of可能会派上用场。

于 2013-05-16T21:36:11.640 回答