2016-04-20 22 views
16

Nie jestem pewien, gdzie pytać (możesz to zamknąć, jeśli jest to niewłaściwe pytanie), ale nie znalazłem nic na ten temat specjalnie w C++ 17 propozycji, ani this ani this wspomina o tym przy zajmowaniu się zagnieżdżonym dodawaniem przestrzeni nazw. C++.Czy C++ 17 zezwoli na forwardowanie klas zagnieżdżonych?

więc obecnie jest to jedyna opcja:

class A 
{ 
public: 
    class B; //forward-declared INSIDE class/namespace 
}; 

class A::B //defined outside 
{ 
}; 

Będzie to możliwe w C++ 17?

class A::B; //forward declared NESTED outside of parent class/namespace 

class C 
{ 
    A::B *b; 
}; 

i wówczas ta (1) (jak wydaje się wniosek definicji namepsace zagnieżdżonych)

class A::B //definition of A::B without defining A 
{ 

}; 

lub niniejszego (2)

class A 
{ 
public: 
    class A::B 
    { 

    }; 
}; 

lub w [3]

class A 
{ 
public: 
    class B; 
}; 

class A::B 
{ 
}; 

Podejrzewam definicję f A::B bez definicji A pierwszy może nie działać (chociaż wydaje się, że wniosek na to pozwala).

+4

* class * es znacznie różnią się od * przestrzeni nazw * s. Ale patrz [P0289] (http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2016/p0289r0.pdf). – cpplearner

Odpowiedz

6

Istnieje propozycja dotycząca numeru Forward declarations of nested classesP0289R0. Jednak, jak widać z ostatniego Trip Report: C++ Standards Meeting in Jacksonville, February 2016, niniejszy wniosek był zwiastunem propozycji, do których zachęca się dalsze prace. Cytuję werdykt komisji (podkr):

Pozwoliłoby to takie rzeczy jak X::A* pojawiać w nagłówku bez wymagając definicję X się również pojawiać w nagłówku (wybiegające wystarczą deklaracje X i X::A). EWG znalazł przypadek użycia przekonujący, ponieważ obecnie wiele definicji klas do pojawia się w nagłówkach tylko dlatego, że interfejsy zdefiniowane w nagłówku używają wskaźników lub odwołań do zagnieżdżonych klas tego typu. Kilka szczegółów nadal trzeba opracować. (Na przykład, co się stanie, jeśli definicja z X nie pojawi się w żadnej innej jednostce tłumaczeniowej (TU)? Co się stanie, jeśli definicja X pojawi się w innej JT, ale nie będzie oznaczać zagnieżdżonej ? Co się stanie, jeśli definiuje zagnieżdżoną klasę A, ale jest prywatna? Odpowiedź na niektóre lub wszystkie z nich może być "źle sformułowana, nie wymaga diagnostyki", ponieważ diagnozowanie błędów tego rodzaju wymagałoby znacznego wsparcia dla łączników.)

+0

Mogę się mylić, ale wydaje się, że odpowiedzi na podniesione pytania. Nawet jeśli zostałaby po raz pierwszy przyjęta jako bardziej restrykcyjna wersja, byłoby to bardzo korzystne i może zostać złagodzone w późniejszych standardach, jeśli okaże się, że jest w porządku. Myślę, że większym problemem mogą być utracone właściwości wspomniane w artykule - a mianowicie fakt, że powiedzenie X :: A obecnie automatycznie oznacza również definicję i (dlatego) nie powoduje żadnego wyszukiwania nazw. Jednak uważam, że jest to akceptowalna cena.Mam nadzieję, że wszystko zostanie jeszcze dopracowane, a ta propozycja przekształci się w ostateczne C++ 17! – Resurrection

+0

@Resurrection Na szczęście lub niestety, czy odpowiedzi na podniesione pytania zostały udzielone, czy nie, decyzja należy do komitetu C++ :). Osobiście mam nadzieję, że ta propozycja doprowadzi do C++ 17, ponieważ uważam ją za użyteczną i generalnie uważam, że deklaracja forward klas zagnieżdżonych jest dziurą w języku, który musi zostać zamknięty. – 101010

Powiązane problemy