6

尝试使用 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<int>'”。为什么 X 在类定义之外似乎是不可见的?

4

3 回答 3

4

正如 Emile Cormier 在这里正确指出的那样,问题是在 , 的实例化位置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 >
{
};
于 2011-04-26T18:11:05.397 回答
2

struct BA<B<T>::template X>当您指定为基类时,仍将其视为不完整类型。

于 2011-04-26T18:03:23.423 回答
1

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

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

struct B : public A<B::nested>
{
        struct nested {};
};
于 2011-04-26T18:08:26.200 回答