Por favor, vea lo que estoy tratando de hacer:¿Por qué las especializaciones de plantillas no están permitidas en diferentes espacios de nombres?
#include <iostream>
namespace first
{
template <class T>
class myclass
{
T t;
public:
void who_are_you() const
{ std::cout << "first::myclass"; }
};
}
namespace second
{
using first::myclass;
template <>
class myclass <int>
{
int i, j;
public:
void who_are_you() const
{ std::cout << "second::myclass"; }
};
}
esto no está permitido. ¿Podría aclarar por qué no se pueden especializaciones en diferentes espacios de nombres, y cuáles son las soluciones disponibles? Además, ¿es algo fijo en C++ 0x?
Esto me permitiría, por ejemplo, a especializarse std::max
, std::swap
, std::numeric_limits
, etc .. sin tener que recurrir a un comportamiento indefinido mediante la adición de algo que ::std::
?
@AndreyT Así es como yo, aunque lo usaría:
// my_integer is a class
std::numeric_limits<my_integer>::max(); // specialized std::numeric_limits for my_integer
se puede hacer esto?
Como alternativa, ¿no podría hacer una plantilla nueva que hereda de la estándar? – Cogwheel
Según §17.4.3.1/1: "Un programa puede agregar especializaciones de plantilla para cualquier plantilla de biblioteca estándar al espacio de nombres std. Tal especialización (completa o parcial) de una plantilla de biblioteca estándar da como resultado un comportamiento indefinido a menos que la declaración dependa de un usuario -nombre definido de la vinculación externa y a menos que la especialización cumpla con los requisitos de la biblioteca estándar para la plantilla original ". Entonces, si bien existen restricciones, * puede * agregar tales especializaciones a ':: std ::' en las circunstancias adecuadas. –
@jerry Coffin ¡Pensé que agregar algo daría como resultado un comportamiento indefinido! ¿Podría proporcionar una respuesta explicando cómo cumplir estos requisitos? – AraK