以下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编译.
是的,代码是正确的.(引用:§14.6.1[temp.local]/2
在类模板特化或部分特化的范围内,当inject-name-name用作类型名称时,它等同于template-name,后跟类模板特化或部分特化的模板参数在
<>.[ 例如:Run Code Online (Sandbox Code Playgroud)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.
Run Code Online (Sandbox Code Playgroud)