Tengo una clase que utiliza una clase anidada, y quiero usar la clase anidada operator<<
para definir operator<<
en la clase superior. Aquí es cómo mi código es el siguiente:Operador sobrecarga <<: no puede vincular lvalue a 'std :: basic_ostream <char> &&'
#include <memory>
#include <iostream>
template<typename T>
struct classA {
struct classB
{
template<typename U>
friend inline std::ostream& operator<< (std::ostream &out,
const typename classA<U>::classB &b);
};
classB root;
template<typename U>
friend std::ostream& operator<< (std::ostream &out,
const classA<U> &tree);
};
template<typename T>
inline std::ostream& operator<< (std::ostream &out,
const classA<T> &tree)
{
out << tree.root;
return out;
}
template<typename T>
inline std::ostream& operator<< (std::ostream &out,
const typename classA<T>::classB &b)
{
return out;
}
int main()
{
classA<int> a;
std::cout << a;
}
Al compilar sin soporte para C++ 11, la definición de operador < < para la clase interna no parece ser encontrado por el compilador:
so.hpp:24:7: error: no match for ‘operator<<’ in ‘out << tree.classA<int>::root’ so.hpp:24:7: note: candidates are: ...
con GCC 4.6 y 4.7 al compilar con std = C++ 0x:
so.hpp:21:3: error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’ In file included from /usr/include/c++/4.7/iostream:40:0, from so.hpp:2: /usr/include/c++/4.7/ostream:600:5: error: initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = classA<int>::classB]’
¿Alguien me puede decir por qué este código no es legal y cuál es la mejor manera de hacer lo que quiero?
Gracias por proporcionarnos una solución. – Antoine
Lo veo como un * mejor diseño * en lugar de una * solución alternativa *. Tiene su lado negativo (no se puede tomar la dirección de la función de amigo declarada dentro de la clase de plantilla), pero en todas las otras cuentas es una mejor opción proporcionar operadores de funciones libres ... –
Este es el [Hacer nuevos amigos] (https : idioma: //en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Making_New_Friends), no es realmente una solución. – TBBle