以下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编译。
答案 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.