2010-12-04 10 views
5

Estoy intentando sobrecargar el operador ostream para permitir la salida de una clase anidada dentro de una plantilla. Sin embargo, el compilador no puede vincular la llamada de función real a mi sobrecarga.Genere una clase anidada dentro de una plantilla

template <class T> 
struct foo 
{ 
    struct bar { }; 
}; 

template <class T> 
std::ostream& operator << (std::ostream& os, 
    const typename foo<T>::bar& b) 
{ 
    return os; 
} 

int main() 
{ 
    foo<int>::bar b; 
    std::cout << b << std::endl; // fails to compile 
} 

Esto compilará si defino como la sobrecarga de una función en línea friend:

template <class T> 
struct foo 
{ 
    struct bar 
    { 
     friend std::ostream& operator << (std::ostream& os, const bar& b) 
     { 
      return os; 
     } 
    }; 
}; 

pero prefiero definir la sobrecarga fuera de la clase. es posible?

+1

Ver http://stackoverflow.com/questions/4092237/c-nested-class-of-a-template-class –

Respuesta

1

No. :-) Usted ya ha respondido su propia pregunta, pero de alguna manera no le gusta la respuesta? Johannes se vincula a una publicación que explica que la clase interna es un "contexto no deducido". Si hay algunas especializaciones de la plantilla de foo, puede haber varios foos con la misma clase de barra interna. El compilador entonces no puede averiguar qué es foo :: bar, a menos que instanciara foo para todos los Ts posibles. El estándar dice que no tiene que hacer eso.

¿Qué pasa con su solución original con un operador amigo? No tiene que definirlo en línea, solo tiene que declararlo dentro de la clase local.

Cuestiones relacionadas