Pregunta

$ 7.3.3 / 14 (C ++ 03)

struct A { int x(); };
struct B : A { };
struct C : A {
   using A::x;
   int x(int);
};
struct D : B, C {
   using C::x;
   int x(double);
};
int f(D* d) {
   return d->x(); // ambiguous: B::x or C::x
}

El comentario en el código en 'f' indica que uno puede esperar ambigüedad entre 'B :: x' 'C :: x' o.

Sin embargo, en compilar con g ++ (Ideone) o Comeau los errores son ligeramente diferentes. Estos errores en lugar de indicar la ambigüedad en B :: x o C :: x indican el hecho de que A es una base ambigua de D

  

prog.cpp: En función ‘int f (D *)’:   prog.cpp: 16: error: ‘A’ es una   base de ambiguo de ‘D’

y

  

"ComeauTest.c", línea 21: error: Base   clase "A" es ambigua        volver d-> x (); // ambigua: B :: x o C :: x

A juzgar por las reglas de búsqueda de nombres en $ 10,2, me da una sensación de que el comentario en el fragmento de código no es realmente correcto. El error es de hecho, ante todo, relacionada con la ambigüedad de la clase base 'A' en lugar de cualquier otra cosa (por ejemplo, la ambigüedad en la resolución de sobrecarga). ¿Alguna idea?

¿Fue útil?

Solución

Esto es causado por un giro en nombre de búsqueda en C ++ 03: Comprobación de un subobjeto inequívoca era parte del nombre del miembro de la clase de búsqueda en C ++ 03. Operaciones de búsqueda en C ++ 03 encontrarán D :: X y C y A :: x :: x, donde x A :: partidos, pero se asocia con dos sub-objetos distintos de tipo A.

En C ++ 0x, la comprobación para un subobjeto inequívoca es ahora parte de los respectivos subcláusulas, ver DR # 39 :. La clase donde x es directamente un miembro de es una base ambigua - así cláusula 5 causará un error de compilación, en lugar de la cláusula 10

Tenga en cuenta que los comentarios habla de los subobjetos de A. Hay un subobjeto de A que va sobre B camino, y otro subobjeto de A que va sobre C camino. Esta es la razón por la observación dice "B::x o C::x". La presencia de múltiples sub-objetos del mismo tipo de clase puede determinarse tratando de convertir a su tipo de clase, haciendo caso omiso de los problemas de accesibilidad: Si la conversión es ambigua, el subobjeto apareció varias veces.

Otros consejos

Clang ++ da un tanto una combinación de los errores producidos por g ++ y Comeau

C:\Users\SUPER USER\Desktop>clang++ chubsdad.cpp
chubsdad.cpp(12) :  error: ambiguous conversion from derived class 'D' to base class
      'A':
    struct D -> struct B -> struct A
    struct D -> struct C -> struct A
   return d->x(); // ambiguous: B::x or C::x
          ^
1 error generated.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top