dodam do odpowiedzi Jesse'ego o pozornie dziwne zachowanie GCC w kompilacji:
typedef A<T> A;
vs
typedef ::A<T> A;
Odnosi się to również do korzystania z oświadczenia, jak również w postaci:
using A = A<T>;
using A = ::A<T>;
To, co zdarza się w GCC, jest takie, że podczas kompilacji typedef/u Instrukcja sing deklarując B :: A, że symbol B :: A staje się ważnym kandydatem w samym słowie using. To znaczy. gdy mówi się, że using A = A<T>;
lub typedef A<T> A;
GCC uważa, że zarówno kandydaci są ważni, jak i .
To dziwne zachowanie, ponieważ jak sugeruje twoje pytanie, nie oczekujesz, że nowy alias A stanie się prawidłowym kandydatem w samym typie, ale jak mówi również Jesse, wszystko zadeklarowane w klasie staje się widoczne dla wszystkiego innego wewnątrz klasy - iw tym przypadku najwyraźniej nawet sama deklaracja. Ten typ zachowania może zostać zaimplementowany w ten sposób, aby umożliwić definicje typu rekursywnego.
Rozwiązaniem, które znalazłeś, jest dokładne określenie GCC, do którego odwołujesz się w typie, a następnie już nie narzeka.
Musi to być poziom ostrzegawczy, który domyślnie pokazuje to jako błąd. To samo, co w przypadku funkcji, w której brakuje zwrotu, i można ją zgłosić jako błąd lub ostrzeżenie. Ogólnie, unikam deklarowania typu A jako A. To będzie mylące w późniejszym czasie. –
Grzegorz
Nie wiem, co standard mówi, ale cieszę się, że g ++ narzeka ... to po prostu głupie. –
Myślę, że to nie jest ani głupie, ani mylące. Często napotykam na ten problem. Co do ostrzeżenia o konwersji błędów, nie podaję g ++ żadnych flag, jakie ostrzeżenia domyślnie konwertują na błędy? – foxcub