Ésta compila y funciona como debería (plantilla no anidada):operador << (ostream Y, X) para la clase X anidado en una plantilla de clase
#include <iostream>
template<typename T> class Z;
template <typename T>
std::ostream& operator<< (std::ostream& os, const Z<T>&) {
return (os << "Z");
}
template<typename T> class Z {
friend std::ostream& operator<< <> (std::ostream& os, const Z&);
};
int main() {
Z<int> z;
std::cout << z << std::endl;
}
Éste no compilar (gcc 4.4 y gcc 4.6, tanto en el modo de 03 y 0x):
#include <iostream>
template<typename T> class Z;
template<typename T>
std::ostream& operator<< (std::ostream& os, const typename Z<T>::ZZ&) {
return (os << "ZZ!");
}
template <typename T> class Z {
public:
class ZZ {
friend std::ostream& operator<< <> (std::ostream& os, const ZZ&);
};
};
int main() {
Z<int>::ZZ zz;
std::cout << zz << std::endl;
}
el mensaje de error es similar a esto:
error: template-id ‘operator<< <>’ for ‘std::ostream& operator<<(std::ostream&,
const Z<int>::ZZ&)’ does not match any template declaration
error: no match for ‘operator<<’ in ‘std::cout << zz’
en el modo 0x el segundo error que me El sage es diferente, pero el significado es el mismo.
¿Es posible hacer lo que quiero hacer?
EDITAR Al parecer, hay una instancia de contexto no deducido aquí, lo que explica los mensajes de error. La pregunta, sin embargo, sigue en pie: ¿puedo tener un operator<<
que funcione para una clase anidada en una plantilla de clase?
Estoy trabajando en ello ... El primer error se soluciona al poner "operator <<", que también hace las cosas mucho más legibles. –
AudioDroid
posible duplicado de [¿Cómo deducir el tipo de clase del tipo de método en las plantillas C++?] (Http://stackoverflow.com/questions/3830491/how-touce-class-type-type-from-method-type-in-c -templates) –
@Matthieu: Me gustaría ver el código de ese enlace adaptado a este problema. ¿Podría poner eso como una respuesta para los "mortales ordinarios" como yo (y posiblemente "n.m.") aquí? ;-) – AudioDroid