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

时间:2011-04-26 17:48:08

标签: c++ templates metaprogramming crtp

当试着用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;

我得到errormessage“test.cpp:3:26:错误:'struct B&lt; int&gt;'中没有名为'X'的类模板”。为什么X似乎在类定义之外是不可见的?

3 个答案:

答案 0 :(得分:4)

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

解决方法是将模板X移到模板B之外。如果它独立于模板T的特定实例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 >
{
};

答案 1 :(得分:2)

当您将struct B指定为基类时,

A<B<T>::template X>仍被视为不完整类型。

答案 2 :(得分:1)

您尝试使用B的成员作为B的父级来创建递归式情境。例如,这不会编译:

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

struct B : public A<B::nested>
{
        struct nested {};
};