2010-08-23 17 views
6
struct B1{ 
    int d; 
    void fb(){}; 
}; 

struct B2 : B1{ 
    using B1::d; 
    using B1::fb; 

    int d;    // why this gives error? 
    void fb(){}   // and this does not? 
}; 

int main(){} 

¿Es porque, B1::fb() se trata como B1::fb(B1*)and B2::fb() tratados como B2::fb(B2*)? Es decir, ¿el parámetro implícito ayuda a distinguirlos?declaración (clase derivada)

$ 13.3.1/4-

Para funciones no se convierta introducidas por a-declaración usando en un clase derivada, la función se considera ser un miembro de la clase derivada para el propósito de definiendo el tipo de el parámetro de objeto implícito.

estándar

Respuesta

9

El C++ (C++ 03 §7.3.3/12) explica:

Cuando un usando-declaración trae nombres de una clase base en un ámbito de clase derivada, funciones miembro en la anulación de clase derivada y/u ocultar funciones de miembro con el mismo nombre y tipos de parámetros en una clase base (en lugar de estar en conflicto).

En su ejemplo, B2::fb() oculta el B1::fb() introducido por la declaración using.

En cuanto a por qué es mal formada para tener tanto using B1::d; y int d; en la definición de B2, el C++ estándar (C++ 03 §7.3.3/10) explica:

Desde un using-declaration es una declaración, las restricciones en las declaraciones del mismo nombre en la misma región declarativa también se aplican a using-declarations.

Por lo tanto, está mal formada por la misma razón que lo siguiente es mal formada-: da lugar a dos objetos con el mismo nombre en una sola región declarativa:

struct S { int d; int d; }; 
+0

e int d entra en conflicto con la declaración previa de la que usa ... – diverscuba23

+0

¿cuál es la implicación real de $ 13.3.1/4 en ese caso? – Chubsdad

+1

@chubsdad: Dado que 'B2 :: fb()' oculta 'B1 :: fb()', 'B1 :: fb()' no se considera una función candidata durante la resolución de sobrecarga, por lo que §13.3.1/4 lo hace no aplicar. –

Cuestiones relacionadas