Question

J'ai le code comme ceci:

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?
 };

Ai-je besoin le qualificatif d'espace de noms où Derived fait référence à sa catégorie de base? GCC et MSVC sont heureux avec le code tel qu'il est écrit, mais un autre compilateur se plaint à moins que je mets l'espace de noms. Que fait le mot C ++ norme?

Était-ce utile?

La solution

Dans la définition de la classe B est OK. C'est la soi-disant nom de la classe injectée .

fait également référence à des modèles (sans compter les bases dépendantes). Par exemple.

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
};

Dans la classe de base générale (et la classe elle-même) peut être appelée à l'intérieur de la définition de la classe sans arguments de qualification ou modèle.

Citations de la norme:

  

9.2: Un nom de classe est inséré dans le champ où il est déclaré immédiatement après le nom de classe est vu. Le nom de classe est également   inséré dans le champ d'application de la classe elle-même; ceci est connu sous le nom   Classe nom injecté. Aux fins de l'accès de contrôle, la   injecté classe nom est traitée comme si elle était un nom de membre du public.

De cette définition, il en résulte que le nom de la classe elle-même est accessible au public de la classe, et est donc disponible dans les classes dérivées. Ce qui prouve mon point à propos de B étant OK avec N :: B parce que le nom B est héritée

BTW, cela explique aussi pourquoi ce qui suit est invalide:

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 parle sur les noms de classe injectés dans les modèles. Il est beaucoup trop long pour coller ici. HTH

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top