Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板化类中没有名为X的类模板_C++_Templates_Metaprogramming_Crtp - Fatal编程技术网

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

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

当试图用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;};
};
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é我更改了我的答案,以表明即使作为模板参数,它仍然被视为不完整的类型,不能用作模板参数。