1

我想知道两者之间是否存在本质区别:

template <typename T> 
class foo{
  foo<T>(){};
};

template<typename T>
class foo{
  foo(){};
};

两者似乎都有效,但我不明白两者之间的区别。第一个让我很困惑,我不明白<T>在这里的作用是什么。

4

2 回答 2

2

根据注入类名称的规则,它们完全是一回事。

$14.6.1/1 本地声明的名称 [temp.local]

与普通(非模板)类一样,类模板具有注入类名(子句 [class])。注入的类名可以用作模板名或类型名。当它与模板参数列表一起使用时,作为模板模板参数的模板参数,或作为朋友类模板声明的详细类型说明符中的最终标识符,它指的是类模板本身. 否则,它相当于模板名称后跟 <> 中包含的类模板的模板参数。

所以在foo这里foo<T>指的是同样的事情。进一步来说,

第一个让我很困惑,我不明白<T>在这里的作用是什么。

foo您正在使用带有模板参数T(即)的注入类名称foo<T>,它指的是模板类本身。

于 2016-11-12T15:06:48.133 回答
1

请注意,从 C++20 开始,较长的形式不再有效,您必须使用依赖于注入类名称的较短形式。

请参阅[diff.cpp17]#class-2

simple-template-id 不再作为构造函数或析构函数的 declarator-id 有效

在规范中使用以下示例:

template<class T>
struct A {
  A<T>();           // error: simple-template-id not allowed for constructor
  A(int);           // OK, injected-class-name used
  ~A<T>();          // error: simple-template-id not allowed for destructor
};

事实上,GCC 主干版本拒绝使用较长形式的代码(而 Clang 11 和 GCC 10.2仍然接受它)。

于 2021-01-26T09:06:29.237 回答