6

我有一个奇怪的重复模板模式类和一个派生类,如下所示:

template<class Derived>
class A {
  typedef typename Derived::C D;
  D x;
};
class B : public A<B> {
public:
  class C { };
};

当编译器尝试定义 D 时,由于 B 未完全定义,因此无法编译。我怎样才能获得类似的结果,即 A 的成员属于 B 中定义的类型?还是我必须强制在 B 之外定义 C?

4

1 回答 1

9

还是我必须强制在 B 之外定义 C?

是的,不幸的是你必须这样做。通常您可以在之前定义一个模板类A并将其专门用于B,包含该C类型。这允许您在A.

template<typename T>
struct members;

template<class Derived>
class A {
  typedef typename members<Derived>::C D;
  D x;
};

template<>
struct members<class B> {
  class C { };
};
class B : public A<B> {
public:
};
于 2013-02-04T21:35:14.167 回答