【问题标题】:Template Parameters and template arguments模板参数和模板参数
【发布时间】:2020-01-21 04:03:17
【问题描述】:

我对 C++(14) 比较陌生。我正在努力通过阅读来自cpprefernce 的官方文档来增强我目前的知识。我对模板声明有一些疑问:This page 在类模板的声明中提供了以下可能的参数(非类型模板参数)。

type name(optional) // (1)

我的问题是:
1.)type name 是什么意思?我确定它与typename 提到的here 不同。

在同一个page 上,我看到了这个例子:

// simple non-type template parameter
template<int N>
struct S { int a[N]; };

但是从//1 来看,我看到类型名称是可选的,所以我假设下面的内容应该可以工作,但它没有:(事实上,我看到下面的声明template&lt;N&gt; 可以被视为具有类型参数的模板参数。) \

// simple non-type template parameter
template<N>
struct S { int a[N]; };

那么我对官方文档的理解/阅读哪里出了问题?

编辑:

我尝试了以下方法:

template< int>
struct S { int a[N]; };

编译时出现错误'N' was not declared in the scope

【问题讨论】:

  • name 是可选的(N),type 是必需的(int)。但在您的代码中,您实际上需要名称,因此您不能省略它。
  • 你能举个例子吗,没有给出名字,只给出类型?我尝试在编辑中制作这样的示例,但也不起作用。
  • 嗯,当然。它不起作用,因为您实际上需要名称。这有效:template &lt;int&gt; struct S { };
  • 对前向声明很有用。 template&lt;int&gt; struct S;
  • 顺便说一句 - cppreference 不是官方 文档集。不过它们非常有用。

标签: c++ templates c++14


【解决方案1】:

为此,N 需要是一个类型。

模板只接受一个类型,后跟该类型的可选名称。所以例如这个可能工作(虽然我还没有尝试过):

template <int> // ...

但请注意,N 未声明。如果你想在你的模板中使用N,你需要像这样声明N

template <int N> // ...

这里,N 被声明为 int,因此您可以像使用 int 一样使用它。


注意:您还可以选择以下内容:

template <class N> // ...

这里N 成为类型的模板替换。它不是上面的 int。

当然,这可能不是你想要的。

【讨论】:

  • 我从 Barry 的评论中看到了 template &lt;int&gt; struct S { } 的作品。但后来我认为它没有解决任何目的。从@Kerndog73 的回答中,我看到这可以用于模板类的前向声明。我从来没有使用过模板类的前向声明。这种声明还有其他用途吗?
  • 模板类的前向声明?我假设您首先使用前向声明的相同原因仍然适用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 2012-01-20
相关资源
最近更新 更多