2010-08-23 25 views
6
struct B1{ 
    int d; 
    void fb(){}; 
}; 

struct B2 : B1{ 
    using B1::d; 
    using B1::fb; 

    int d;    // why this gives error? 
    void fb(){}   // and this does not? 
}; 

int main(){} 

Czy to dlatego, B1::fb() jest traktowany jako B1::fb(B1*)and B2::fb() traktowane jako B2::fb(B2*)? To znaczy, czy niejawny parametr pomaga w ich odróżnieniu?Korzystanie deklaracja (pochodzące klasa)

$ 13.3.1/4-

Dla funkcji nonconversion wprowadzonych przez używając-zgłoszenia na pochodnej klasy funkcja jest uważany należeć do klasy pochodnych do CELÓW definiowanie typu obiektu niejawnego obiektu .

Odpowiedz

9

C++ średnia (C++ 03 §7.3.3/12) wyjaśnia

Gdy pomocą deklaracja przynosi nazwy z klasy bazowego do pochodnej zakresu klasy funkcje składowe w klasie pochodnej zastępuje i/lub ukrywa funkcje składowe o tej samej nazwie i typach parametrów w klasie bazowej (a nie w konflikcie).

W twoim przykładzie ukrywa B1::fb() wprowadzony przez deklarację użycia.

Jak, dlaczego jest źle sformułowane, aby mieć zarówno using B1::d; i int d; w definicji B2, C++ Standard (C++ 03 §7.3.3/10) wyjaśnia:

Ponieważ Użycie deklaracji jest deklaracją, ograniczenia dotyczące deklaracji o tej samej nazwie w tym samym regionie deklaratywnym odnoszą się również do deklaracji użycia-.

Tak, to jest źle uformowane z tego samego powodu, że po to źle sformułowane: wynika to z dwóch obiektów o tej samej nazwie w jednym regionie deklaratywnej:

struct S { int d; int d; }; 
+0

i int d sprzeczne z poprzednią deklaracją z użycia ... – diverscuba23

+0

jaka jest rzeczywista domniemana 13.3.1 $/4 w tym przypadku? – Chubsdad

+1

@chubsdad: Ponieważ 'B2 :: fb()' ukrywa 'B1 :: fb()', 'B1 :: fb()' nie jest uważane za funkcję kandydującą podczas rozwiązywania przeciążenia, więc §13.3.1/4 ma nie stosuje się. –