2011-12-20 17 views
6

¿El siguiente código C++ es correcto? Y si es así, ¿podría alguien señalarme un párrafo en el estándar que menciona esto? Parece que uno puede usar template-name en lugar de template-id en un alcance adjunto con la plantilla y el compilador agrega automáticamente la lista de argumentos de la plantilla.Usando template-name en lugar de template-id dentro de la definición de plantilla de clase

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

en contraposición a:

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

El código se compila con g ++, así como en el estudio visual MS.

+1

El código es correcto. 'Mana' es equivalente a' Mana '. Para una cita del estándar, tenemos que esperar. – iammilind

Respuesta

7

Sí, el código es correcto. (La cita: §14.6.1 [temp.local]/2

Dentro del alcance de una especialización plantilla de clase o especialización parcial, cuando la inyectado nombre-clase- es utilizado como de tipo nombrar, es equivalente a la plantilla-nombreseguido por los plantilla-argumentos de la especialización clase plantilla o especialización parcial encerrada en <> [Ejemplo:.

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

-ejemplo extremo]

)

De hecho esto se utiliza por todo el lugar en la norma, así, por ejemplo,

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