He intentado utilizar el tipo incompleta en anidados nombre especificador como las siguientes:

class A;

int b= A::c; //error: incomplete type ‘A’ used in nested name specifier

class A {
    static const int c=5;
};

No se dice nada al respecto en la 3.4.3/1 de N3797 proyecto de trabajo:

El nombre de una clase o espacio de estados o enumerador puede ser referido
después de la :: operador de resolución de ámbito (5.1) aplicado a una
nested-nombre-especificador que denota su clase, espacio de nombres, o
la enumeración de

Así es que el comportamiento depende de la implementación?

  • La parte que se cita no dice que usted puede utilizar una instrucción anidada nombre después de un delantero de la declaración de una clase.
  • El nombre de la Una fue declarada antes de ser usado. Esto implica que dicho nombre no contradice a la cita. Tenga en cuenta que el nombre de la Una fue declarada antes de ser usado, como se dijo en la sección 3.4.1/4: A name used in global scope, outside of any function, class or user-declared namespace, shall be declared before its use in global scope.
  • debe ser de la clase{ public const int c = 5;};
  • Formalmente, este código está mal formado, no porque A es incompleta, pero debido a que el nombre de c no es declarado dentro del ámbito de aplicación de la A en el punto donde se utiliza, por lo que el nombre completo de búsqueda (3.4.3) falla. Me imagino que el compilador autores decidieron que «la clase es incompleta» (y por lo tanto, ninguno de sus miembros fueron declarados de manera cualificada la búsqueda del nombre no puede tener éxito) era más útil mensaje de error.
InformationsquelleAutor | 2014-06-07

1 Comentario

  1. 38

    Introducción

    Hay varios lugares en la norma que de manera implícita que el código está mal formado, pero la siguiente cita habla por sí mismo:

    3.3.2p6 Punto de la declaración [basic.scope.pdecl]

    Después de que el punto de la declaración de un miembro de la clase, el nombre del miembro puede ser consultado en el ámbito de su clase.

    El problema con tu código no es que trate de alcanzar el interior del cuerpo de un tipo incompleta, el problema es que sólo se puede hacer referencia a un miembro de la clase nombre de después de ha sido declarada.

    Ya que su avance-declaración (por supuesto) no introducir ningún miembro llamado c, no está mal formado para referirse a tal nombre.


    La engañosa diagnóstico…

    El diagnóstico emitido por tanto gcc y clang cuando se alimenta el código es un poco engañoso, y de verdad me siento un informe de error está en orden.

    foo.cpp:3:8: error: incomplete type 'A' named in nested name specifier

    Nos son permitido para el nombre de un tipo incompleta en un nested-nombre-especificador de, pero como se dijo; no se nos permite referir a un miembro que aún no ha sido declarada.

    mal formado:

    class X {
      static int a[X::x];        //ill-formed, `X::x` has not yet been declared
      static int const x = 123;
    };

    legal:

    class X {
      int const x = 123;
      int a[X::x]; //legal, `X` is incomplete (since we are still defining it)
                   //       but we can still refer to a _declared_ member of it
    };

Dejar respuesta

Please enter your comment!
Please enter your name here