To pytanie sprawiło, że zastanawiałem się, czy kiedykolwiek przydatne / konieczne jest pełne kwalifikowanie nazw klas (w tym operatora zasięgu globalnego) w definicji funkcji członka poza klasą.
Z jednej strony nigdy wcześniej tego nie widziałem (a składnia, aby to zrobić, wydaje się niejasna). Z drugiej strony wyszukiwanie nazw w C ++ jest bardzo nietrywialne, więc może istnieje przypadek narożny.
Pytanie:
Czy kiedykolwiek zdarza się, że wprowadzenie pozaklasowej definicji funkcji członka
ReturnType (::Fully::Qualified::Class::Name::MemberFunctionName)(...) { ... }
różni się od
ReturnType Fully::Qualified::Class::Name::MemberFunctionName(...) { ... }
(brak ::
prefiksu zasięgu globalnego )?
Należy pamiętać, że definicje funkcji członek musi być wprowadzane do otaczającej przestrzeni nazw klasy, więc to nie jest poprawnym przykładem.
Odpowiedzi:
Użyciu dyrektywą może powodować
Fully
być niejednoznaczne bez kwalifikacji.źródło
Jest to konieczne, jeśli ktoś jest masochistą i lubi pisać takie rzeczy
Drugie przeciążenie można oczywiście napisać jak
foo::foo::bar::baz
w zakresie globalnym, ale pytanie brzmiało, czy te dwie deklaracje mogą mieć inne znaczenie. Nie polecałbym pisania takiego kodu.źródło
using
. Miło mieć różne przypadki podświetlone!Jeśli używana jest dyrektywa używająca, kod może być mylący.
Rozważ następujący program demonstracyjny
Więc dla czytelności ta kwalifikowana nazwa
pokazuje dokładnie, gdzie funkcja jest zadeklarowana.
źródło