Domanda

Ho un codice come questo:

namespace N {
   class B {
     public:
       virtual void doStuff(B *) = 0;
    };
 }

 // not in a namespace
 class Derived : public N::B {
   public:
       void doStuff(B *); // Should this be N::B, or is B ok?
 };

Ho bisogno il qualificatore dello spazio dei nomi in cui Derivata si riferisce alla classe base?GCC e MSVC sono felice con il codice scritto, ma un altro compilatore si lamenta a meno che non ho messo lo spazio dei nomi in.Che cosa fa il C++ standard di dire?

È stato utile?

Soluzione

All'interno della definizione della classe B è OK.Questo è il cosiddetto iniettato nome della classe.

Questo vale anche per i modelli (non contando dipendente basi).E. g.

template <class T> class B{};
template <class T> class C: public B<int>
{
   void f(B* p) {} //same as B<int>* p
   void f(C* p) {} //same as C<T>* p
};

In generale la classe base (e la classe stessa) può essere riferito all'interno della definizione della classe, senza qualifica o di un modello di argomenti.

Le citazioni dalla norma:

9.2 :Una classe di nome è inserito nell'ambito in cui viene dichiarata immediatamente dopo il nome di classe è visto.Il nome di classe è anche inserito nell'ambito della classe stessa;questo è noto come il iniettato-classe di nome.Per finalità di controllo dell'accesso, la iniettato-classe di nome è trattato come se fosse un membro pubblico nome.

Da questa definizione segue che il nome della classe stessa è pubblicamente accessibile dalla classe, e quindi è disponibile nelle classi derivate.Il che dimostra il mio punto di essere OK con N::B perché il nome di B è ereditato

Btw, questo spiega anche perché i seguenti non è valido:

template <class T> class B{};
template <class T> class C: public B<T>
{
     void f(B* p){} //ERROR
    // the above is invalid!! Base class is dependent therefore 
    //its scope is not considered during unqualified name lookup
     void g(typename C::B* p){} //this is valid, same as B<T>* p  
};

14.6.1 Parla di classe iniettata nomi modelli.È troppo lungo per incollare qui.Hth

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top