Wpis z mikrobloga

window-simple-main.hpp(186): error C2872: 'Projector': ambiguous symbol (compiling source file mocscompilation.cpp)

window-basic-main.hpp(75): note: could be 'Projector' (compiling source file mocscompilation.cpp)

window-simple-main.hpp(60): note: or 'Simplified::Projector' (compiling source file mocs_compilation.cpp)


Mam dwie klasy: BasicWindow i SimpleWindow. W headerze BasicWindow mam jeszcze struct Projector, a w headerze SimpleWindow także struct Projector, ale w namespace Simplified. I jak się odwołuję w pliku cpp SimpleWindow do klasy Projector (wcześniej pisząc "using namespace Simplified") to wywala mi błąd jak wyżej... ale plik z SimpleWindow nie ma w ogole dostępu do headera z BasicWindow, więc dlaczego? Czy nazwy klas muszą być unikalne?

#programowanie #cpp
  • 7
@Capt_S: Wydaje mi się że nie. Z racji że headery działają na zasadzie "doklejania" kodu to łatwo coś dołączyć "na około" i wtedy pojawiają się takie błędy.
@Sedd: Visual Studio mnie ostrzega o "ambiguous" nawet PRZED deklaracją w namespace, a próba kompilacji wywala "undeclared identifier", a więc to VS albo qmake (bo używam Qt) dbają o czystość kodu dodatkowo?
@Capt_S: @Sedd: Z jakiegoś powodu Qt mu tworzy jeden plik 'mocs_compilation.cpp' zamiast jednego na każdy plik nagłówkowy. Nie wiem co to za wersja Qt, ale jeżeli tak jest faktycznie, to może by tak, że jakiś w jakimś kodzie wygenerowanym przez Meta Object Compiler załącza się ADL i nie wie którą klasę wybrać.
Dlatego ciepnij tej 'Projector' z window-basic-main.hpp(75) do osobnego namespace, powinno pomóc.
Aczkolwiek MOC z Qt i tak nie