6

不思議なことに繰り返されるテンプレート パターン クラスと次のような派生クラスがあります。

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

これは、コンパイラが D を定義しようとしたときに B が完全に定義されていないため、コンパイルに失敗します。同様の結果を得るにはどうすればよいですか。つまり、B で定義された型の A のメンバを作成するにはどうすればよいですか? または、C を B の外で定義するように強制する必要がありますか?

4

1 に答える 1

9

または、C を B の外で定義するように強制する必要がありますか?

はい、残念ながら、これを行う必要があります。通常、事前にテンプレート クラスを定義し、型を含む にA特化することができます。これにより、 で使用できるようになります。BCA

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 に答える