使用template-name代替类模板定义中的template-id

mgr*_*gor 6 c++ templates

以下C++代码是否正确?如果是这样,有人能指出标准中提到这一段的段落吗?似乎可以在模板附带的范围中使用template-name而不是template-id,编译器会自动添加模板参数列表.

template<class Type>
class Mana {
public:
  Mana(const Mana& m) {/*...*/}
  Mana() {/*...*/}
};
Run Code Online (Sandbox Code Playgroud)

而不是:

template<class Type>
class Mana {
public:
  Mana(const Mana<Type>& m) {/*...*/}
  Mana() {/*...*/}
};
Run Code Online (Sandbox Code Playgroud)

代码用g ++和MS visual studio编译.

ken*_*ytm 7

是的,代码是正确的.(引用:§14.6.1[temp.local]/2

在类模板特化或部分特化的范围内,当inject-name-name用作类型名称时,它等同于template-name,后跟类模板特化或部分特化的模板参数<>.[ 例如:

template<template<class> class T> class A { };
template<class T> class Y;
template<> class Y<int> {
   Y* p;        // meaning Y<int>
   Y<char>* q;  // meaning Y<char>
   A<Y>* a;     // meaning A<::Y>
   class B {
       template<class> friend class Y;   // meaning ::Y
   };
};
Run Code Online (Sandbox Code Playgroud)

- 结束例子 ]

)

实际上,这也在标准中的所有地方使用,例如

// §20.4.2.1[tuple.cnstr]/10-13
tuple(const tuple& u) = default;
tuple(tuple&& u) = default;

// §21.4.6.1[string::op+=]/1-2
basic_string& operator+=(const basic_string& str);

// etc.
Run Code Online (Sandbox Code Playgroud)