6

この(CRTPのような)コードをGCC 4.6.0でコンパイルしようとすると:

template<template<class> class T> struct A;

template<class T> 
struct B: A<B<T>::template X> {
    template <class U> struct X { U mem; };
};

B<int> a;

「test.cpp:3:26:エラー:「structB<int>」に「X」という名前のクラステンプレートがありません」というエラーメッセージが表示されます。Xがクラス定義の外で見えないように見えるのはなぜですか?

4

3 に答える 3

4

Emile Cormierがここで正しく指摘しているように、問題は、のインスタンス化の場所でABがまだ不完全なタイプであり、内部テンプレートを使用できないことです。

Xそのための解決策は、テンプレートをテンプレートの外に移動することですBTテンプレートの特定のインスタンス化 にB依存しない場合は、名前空間レベルに移動するだけです。インスタンス化に依存する場合は、型特性を使用できます。

template <typename T>
struct inner_template 
{
   template <typename U> class tmpl { U mem; }; // can specialize for particular T's
};
template <typename T>
struct B : A< inner_template<T>::template tmpl >
{
};
于 2011-04-26T18:11:05.397 に答える
2

struct BA<B<T>::template X>基本クラスとして指定すると、まだ不完全なタイプと見なされます。

于 2011-04-26T18:03:23.423 に答える
1

のメンバーを、再帰的な状況を作成するB親として使用しようとしています。Bたとえば、これもコンパイルされません。

template<template<class> class T> struct A {};

struct B : public A<B::nested>
{
        struct nested {};
};
于 2011-04-26T18:08:26.200 に答える