我有这样的代码:

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

我是否需要派生的名称空间预选赛,它是指它的基类? GCC和MSVC对书面的代码感到满意,但是除非我放入名称空间,否则另一个编译器会抱怨。C++标准说什么?

有帮助吗?

解决方案

在类定义内部B是可以的。那是所谓的 注入类名称.

这也指模板(不计算依赖基础)。例如

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

通常,可以在类定义中引用基类(以及类本身),而无需资格或模板参数。

标准的行情:

9.2:插入一个类名称的范围,在该范围内,在看到类名称后立即声明。班级名称也插入了班级本身的范围。这被称为注入式名称。为了进行访问检查,注射级名称被视为是公共成员名称。

从这个定义来看,可以从类中公开访问类本身的名称,因此可以在派生的类中获得。这证明了我关于B与N :: B一起确定的观点,因为该名称B是继承的

顺便说一句,这也解释了为什么以下内容无效:

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谈论模板中注入的类名称。在这里粘贴太久了。 Hth

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top