模板类中没有名为 X 的类模板
当尝试使用 GCC 4.6.0 编译此(类似 CRTP 的)代码时:
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: error: no class template named 'X' in 'struct B
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
正如埃米尔·科米尔(Emile Cormier)此处正确指出问题是在
A
实例化的地方,B
仍然是一个不完整的类型,并且你不能使用内部模板。解决方案是将模板
X
移到模板B
之外。如果它独立于模板B
的特定实例化T
,只需将其移动到命名空间级别,如果它依赖于实例化,则可以使用类型特征:As Emile Cormier correctly points out here the problem is that at the place of instantiation of
A
,B
is still an incomplete type, and you cannot use the inner template.The solution for that is moving the template
X
outside of the templateB
. If it is independent of the particular instantiationT
of the templateB
, just move it to the namespace level, if it is dependent on the instantiation, you can use type traits:当您指定
A::template X>
作为基类时,struct B
仍被视为不完整类型。struct B
is still considered an incomplete type when you specifyA<B<T>::template X>
as the base class.您尝试使用
B
的成员作为B
的父级来创建递归式情况。例如,这也不能编译:You're trying to use a member of
B
as a parent ofB
creating a recursive-esque situation. For example this doesn't compile either: