C++ 两个模板类将彼此用作模板参数

C++ 两个模板类将彼此用作模板参数,c++,templates,C++,Templates,两个模板类可以相互使用作为模板参数,但如果我使用在一个类作用域中定义的任何内容,则无法对其进行编译 template<class B> struct A { typedef A *pointer; }; template<class A> struct B { //typedef A::pointer APtr; //using APtr = A::pointer; //APtr pa; A::pointer pa; }; str

两个模板类可以相互使用作为模板参数,但如果我使用在一个类作用域中定义的任何内容,则无法对其进行编译

template<class B> struct A {
    typedef A *pointer;
};
template<class A> struct B {
    //typedef A::pointer APtr;
    //using APtr = A::pointer;
    //APtr pa;
    A::pointer pa;
};

struct AA;
struct BB;
struct AA : public A<BB> {};
struct BB : public B<AA> {};
模板结构A{
typedef A*指针;
};
模板结构B{
//typedef A::指针APtr;
//使用APtr=A::指针;
//APtr-pa;
A::指针pa;
};
结构AA;
结构BB;
结构AA:公共A{};

结构BB:公共B?有没有一种可能的修复方法?

gcc的错误消息提供了更多信息:

t.C:8:5: error: need ‘typename’ before ‘A::pointer’ because ‘A’ is a dependent scope
    8 |     A::pointer pa;
      |     ^
      |     typename 
这样做会让gcc感到高兴:

template<class B> struct A {
    typedef A *pointer;
};
template<class A> struct B {
    //typedef A::pointer APtr;
    //using APtr = A::pointer;
    //APtr pa;
    typename A::pointer pa;
};

struct AA;
struct BB;
struct AA : public A<BB> {};
struct BB : public B<AA> {};
模板结构A{
typedef A*指针;
};
模板结构B{
//typedef A::指针APtr;
//使用APtr=A::指针;
//APtr-pa;
typename A::指针pa;
};
结构AA;
结构BB;
结构AA:公共A{};
结构BB:公共B{};
这不是模板循环引用。第一个模板中的唯一引用是它自己的模板参数。仅仅因为它的模板参数恰好命名为
B
,并且后来又定义了另一个同名的模板,所以不能将模板参数作为对另一个模板的引用

就实际类而言,向前声明(如本例中所示)使类之间的循环引用成为可能。

请注意,
template
template struct B无关即使您使用相同的名称。(这太令人困惑了)。通常的方法是使用名称
T
(如果没有相关/更好的名称)。
template<class B> struct A {
    typedef A *pointer;
};
template<class A> struct B {
    //typedef A::pointer APtr;
    //using APtr = A::pointer;
    //APtr pa;
    typename A::pointer pa;
};

struct AA;
struct BB;
struct AA : public A<BB> {};
struct BB : public B<AA> {};