2011-12-20 76 views
6

以下C++代碼是否正確?如果是這樣,有人可以指出我在標準中提到過這一段嗎?似乎可以在模板所包含的作用域中使用模板名稱而不是模板標識,編譯器會自動添加模板參數列表。使用模板名代替類模板定義中的模板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視覺工作室。

+1

該代碼是正確的。 'Mana'等同於'Mana '。對於標準報價,我們需要等待。 – iammilind 2011-12-20 10:44:28

回答

7

是的代碼是正確的。 (引證:§14.6.1[temp.local]/2

在類模板特或部分特的範圍,當注射類名是用作類型 - 命名,它相當於接着模板參數的類 模板特或部分特封閉在<>模板名稱 [例:

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.