C++ 模板化类中没有名为X的类模板
当试图用GCC 4.6.0编译此(类似CRTP)代码时:C++ 模板化类中没有名为X的类模板,c++,templates,metaprogramming,crtp,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; 模板结构A; 模板 结构B:A{ 模板结构X{U mem
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;
模板结构A;
模板
结构B:A{
模板结构X{U mem;};
};
B a代码>
我收到错误消息“test.cpp:3:26:error:structb”中没有名为“X”的类模板”。为什么X在类定义之外似乎是不可见的 当指定A
作为基类时,结构B
仍然被认为是不完整的类型。您试图使用B
的成员作为B
的父类,从而创建一种递归的情况。例如,这也不会编译:
template<template<class> class T> struct A {};
struct B : public A<B::nested>
{
struct nested {};
};
模板结构A{};
结构B:公共A
{
结构嵌套{};
};
正如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 >
{
};
模板
结构内部模板
{
模板类tmpl{U mem;};//可以专门用于特定的T
};
模板
结构B:A
{
};
My compiler在这方面有问题::aX是一个未声明的标识符。坦率地说,我对您的语法感到困惑,B::template应该是什么?此外,我从未见过:模板类T。如果有的话,我想我会从你那里学到一些东西;你能解释一下语法的重要性吗?我不确定,但约翰尼斯在这个主题中的回答可能会有所帮助:@leetnighshade:我不确定,但我想你的错误信息实际上和我说的是一样的:X在B之外是不可见的(这就是我的理解方式)。关于你的第二个问题:“模板类T”意味着T是模板化的。就像这样,你可以在A的类定义中使用像T这样的东西。你想做什么…?那不是真的:我将B作为模板参数传递,而不是从它继承。@Tom De Caluwé我更改了我的答案,以表明即使作为模板参数,它仍然被视为不完整的类型,不能用作模板参数。