两个模板类相互用作模板参数

两个模板类可以相互用作模板参数,但如果我使用在一个类范围内定义的任何内容,则无法编译它。

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> {};

VS2017 抱怨:

1>c:\test.cpp(59): warning C4346: 'pointer': dependent name is not a type
1>c:\test.cpp(59): note: prefix with 'typename' to indicate a type
1>c:\test.cpp(60): note: see reference to class template instantiation 'B<A>' being compiled
1>c:\test.cpp(59): error C2061: syntax error: identifier 'pointer'
1>c:\test.cpp(59): error C2238: unexpected token(s) preceding ';'
1>c:\test.cpp(69): warning C4091: '': ignored on left of 'A<BB> *' when no variable is declared

是否也涉及循环依赖有没有一种可能的方法来解决它?

萨姆·瓦尔沙夫奇克

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> {};

这不是模板循环引用。第一个模板中唯一的引用是它自己的模板参数。仅仅因为它的模板参数恰好被命名为B,并且有另一个模板定义了相同的名称,稍后,不会使模板参数成为另一个模板的引用。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

两个模板类相互调用方法

具有一个和两个模板参数的模板类

模板参数用作类成员

用作模板类中的参数

检查两个模板模板参数是否相同

基于可变参数模板的两个交互类的多重继承...

两个仅在模板参数上有所不同的类

交换可变参数模板中的两个参数

一个模板中有两个“参数”

如何使用两个模板模板参数指定共享模板变量?

如何从双参数模板创建单参数模板以用作基类模板模板参数

为什么模板参数推导不能与仅指定前两个参数的可变参数模板类一起使用?

连接两个类型的可变参数模板包

用两个不同的模板参数定义函数

模板和两个单独的类之间的区别

如何为两个不同的模板使用ListView类

仅在具有两个基类的情况下,才允许在模板参数中使用类类型

带有两个模板参数的可变参数模板推导失败

C ++如果两个模板函数都匹配参数列表,则将调用哪个模板

Django模板,向模板标签发送两个参数?

无法比较具有固定数量参数的两个模板模板类型

c ++用作模板参数

不能在模板专门化定义中将一个类的成员typedef用作模板参数

使用成员函数中使用的两个模板在类模板中定义成员函数的单个模板

C ++:在完全定义类之前将类用作模板参数

如何定义在两个类之外的模板类内部的非模板类中声明的friend函数?

可以将模板变量用作模板参数(类似于类模板)吗?

类特化,没有用作特化模板参数的类的模板参数

将对基类的引用作为模板参数传递