模板化类中没有名为X的类模板

No class template named X in templated class

本文关键字:      更新时间:2023-10-16

当试图用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:在' struct B '中没有名为' X '的类模板"。为什么在类定义之外X似乎是不可见的?

正如Emile Cormier在这里正确指出的那样,问题是在A实例化的地方,B仍然是一个不完整的类型,并且您不能使用内部模板。

解决方法是将模板X移到模板B之外。如果它独立于模板B的特定实例化T,只需将其移动到命名空间级别,如果它依赖于实例化,您可以使用类型特征:

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 >
{
};
当您指定A<B<T>::template X>作为基类时,

struct B仍然被认为是不完整类型。

您正在尝试使用B的成员作为B的父级创建递归式情况。例如,这也不能编译:

template<template<class> class T> struct A {};
struct B : public A<B::nested>
{
        struct nested {};
};
相关文章:
  • 没有找到相关文章