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

时间:2011-12-20 10:31:33

标签: c++ templates

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

template<class Type>
class Mana {
public:
  Mana(const Mana& m) {/*...*/}
  Mana() {/*...*/}
};

而不是:

template<class Type>
class Mana {
public:
  Mana(const Mana<Type>& m) {/*...*/}
  Mana() {/*...*/}
};

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

1 个答案:

答案 0 :(得分:7)

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

  

在类模板特化或部分特化的范围内,当注入类名时   用作类型名称,它等同于 template-name ,后跟类的 template-arguments   <>中包含的模板专精或部分专业化。 [示例:

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
   };
};
     

- 结束示例]

事实上,这也用于标准中的所有地方,例如

// §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.