mam ten kod (problem diament):Diamond of śmierci i operatora rozdzielczość zakres (w C++)
#include <iostream>
using namespace std;
struct Top
{
void print() { cout << "Top::print()" << endl; }
};
struct Right : Top
{
void print() { cout << "Right::print()" << endl; }
};
struct Left : Top
{
void print() { cout << "Left::print()" << endl; }
};
struct Bottom: Right, Left{};
int main()
{
Bottom b;
b.Right::Top::print();
}
chcę zadzwonić print()
w Top
klasie.
Kiedy próbuję ją skompilować, pojawia się błąd: 'Top' is an ambiguous base of 'Bottom'
w tej linii: b.Right::Top::print();
Dlaczego jest niejednoznaczny? Wyraźnie określiłem, że chcę Top
od Right
, a nie od Left
.
Nie chcę wiedzieć JAK to zrobić, tak, można to zrobić za pomocą odniesień, dziedziczenia wirtualnego, itp. Chciałbym tylko wiedzieć, dlaczego jest niejednoznaczne, ponieważ jest b.Right::Top::print();
.
Jest to niejednoznaczne przez * "Jeśli operator dostępu do elementu klasy, w tym niejawne" to-> ", jest używane w celu uzyskania dostępu do niestatycznego elementu danych lub niestatycznej funkcji elementu, odniesienie jest źle sformułowane, jeśli lewy operand (uważany za wskaźnik w "."Przypadek operatora" nie może zostać niejawnie przekonwertowany na wskaźnik do klasy nazw prawego operandu "*, 11.2p6. Zauważ, że klasa nazewnictwa to' A', ale 'D *' nie może być niejawnie przekształcona w 'A *'. –
Semantyka polega na tym, że mówisz, jaką funkcję chcesz wywołać za pomocą 'B :: A :: tell' .Pomóż kompilatorowi w użyciu' D :: tell', np. Przy wyszukiwaniu nazw. Podaj podobiekt, którego musi użyć - będzie miał dwie opcje: Zejście w dół do "A" ponad "B" lub przez "C", i da ci błąd –
Istnieją dwie "poważne" kontrole niejednoznaczności które są wykonywane w kontekstach działających na obiektach w czasie wykonywania: jeden w wersji 5.2.5p5 i taki, który cię gryzie tutaj w 11.2p6. Ten w 5.2.5p5 odrzuca 'd.tell()' jeśli chcesz usunąć wszystkie funkcje tell z wyjątkiem jednego z 'A', ponieważ klasą nazewnictwa jest' D', ale 'tell' będzie bezpośrednim członkiem' A', a 'A' jest niejednoznaczne .Jeśli następnie powiesz' DB :: A :: tell() ', jest dobrze uformowany przez 5.2.5p5 , ale źle sformułowany przez 11.2p6. Kontrole te uzupełniają się i są ważne dla prawidłowego działania w systemie typu. –