当试着用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似乎在类定义之外是不可见的?
答案 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 {};
};