Pregunta

¿Esto se compila sin problemas en VS 2009? ¿Soy estúpido? GCC da una advertencia, que la plantilla es privada ....? ¿Qué me estoy perdiendo?

#include <iostream>

using namespace std;

class A
{
private:
    template<typename T>
    A& operator<<(const T & v)
    {
        cout << v << endl;
        return *this;
    }
};

int main()
{
   A a;
   a << 4;
   system("pause");
}
¿Fue útil?

Solución

Este código no debe compilar: este es un error (o extensión tonta) en vs. GCC debería rechazarlo también. El operador es inaccesible en el alcance que se usa.

Comeau trata esto correctamente:

"ComeauTest.c", line 28: error: function "A::operator<<(const T &) [with T=int]"
          (declared at line 14) is inaccessible
     a << 4;

Editar: un fragmento estándar relevante, del 13.3/1

Nota: No se garantiza que la función seleccionada por resolución de sobrecarga sea apropiada para el contexto. Otras restricciones, como la accesibilidad de la función, pueden hacer que su uso en el contexto de llamadas sea mal formado.

Otros consejos

Microsoft reconoce el error y afirma que se solucionará en la próxima versión principal para el compilador (que leí como VC11/VS-lo que sea, después de 2011, probablemente no sea un paquete de servicio para VC10/VS2010):

A partir de los comentarios, la solución ya parece estar hecha en una compilación interna del compilador.

No, no eres estúpido, es un código roto y debe ser rechazado. El compilador Comeau (http://www.comeaucomputing.com/tryitout) lo rechace correctamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top