Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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++ 为什么';这个递归模板不起作用吗?_C++_Templates - Fatal编程技术网

C++ 为什么';这个递归模板不起作用吗?

C++ 为什么';这个递归模板不起作用吗?,c++,templates,C++,Templates,因此,我尝试创建一个简单的递归模板,以生成一个大但不重要的嵌套类型: #include <type_traits> #include <typeinfo> #include <boost/core/demangle.hpp> template <typename T> struct A {}; template <typename T, int N> struct Nest { using type = Nest<A&l

因此,我尝试创建一个简单的递归模板,以生成一个大但不重要的嵌套类型:

#include <type_traits>
#include <typeinfo>

#include <boost/core/demangle.hpp>

template <typename T>
struct A {};

template <typename T, int N>
struct Nest
{
  using type = Nest<A<T>, N-1>
};

template <typename T>
struct Nest<T, 0>
{
  using type = T;
};

int main()
{
  typename Nest<A<int>, 20>::type x;
  std::cout << boost::core::demangle(typeid(x).name());
};
#包括
#包括
#包括
模板
结构A{};
模板
结构巢
{
使用type=Nest
};
模板
结构巢
{
使用类型=T;
};
int main()
{
typename嵌套::type x;

std::cout忘记了递归步骤:

template <typename T, int N>
struct Nest
{
  using type = Nest<A<T>, N-1>::type
};
模板
结构巢
{
使用type=Nest::type
};

可能需要
typename
--我现在没有访问编译器的权限。

这是执行递归的最干净的方法,如下所示:

template <typename T>
struct A {};

template <typename T, unsigned N>
struct Nest:Nest<A<T>,N-1> {};

这是一个糟糕的答案。请在需要
typename
的地方写下。初学者自己不会知道。根据我对规则的理解,
typename
关键字是必需的,因为
Nest
的模板参数强制假定
在值之前。对吗?这是我的经验朋友,编译器之间的行为各不相同。不管给定的编译器是否在没有给定关键字的情况下接受它,都可能不能很好地表明它是正确的。我已经纠正了我严重的违规行为。一些最好的代码都写在餐巾纸的背面。真实的故事。嘿,当然:但是“为什么这段代码不起作用?”由于完全不相关的原因(打字错误!)而无法工作的代码通常会适得其反
template <typename T>
struct A {};

template <typename T, unsigned N>
struct Nest:Nest<A<T>,N-1> {};
template <typename T>
struct Nest<T, 0> {
  using type = T;
};
template <typename T, unsigned N>
using Nest_t = typename Nest<T,N>::type;

int main() {
  Nest_t<int, 20> x;
  std::cout << boost::core::demangle(typeid(x).name());
};