为什么会发生此错误?在派生类函数中使用基类函数时

时间:2016-12-08 06:45:26

标签: c++

#include <iostream>

class ZZ
{
public:
    void print1()
    {
        std::cout << "hello\n";
    }
};

class YY : public ZZ
{
public:
    void print()
    {
        using ZZ::print1;
        print1();
    }
};

int main()
{
    YY temp;
    temp.print();
    getchar();
    return 0;
}

如果我编译代码,我会得到错误: error: 'ZZ' is not a namespace or unscoped enum using ZZ::print1;。我糊涂了。

如果我在此文件中定义另一个命名空间,如下所示:

namespace tt{
   int a;
}

我在派生函数print中使用它,如下所示:

void print()
{
    using namespace tt;
    a = 1;
}

代码将被成功编译。但我认为ZZ也是一个命名空间,因为如果我像这样使用ZZ

public:
   using ZZ::print1;
   void print()
   {
       print1();
   }

此代码也将成功编译。

因此,当我在派生函数using ZZ::print1中使用print时,我不知道为什么会发生此错误。

3 个答案:

答案 0 :(得分:1)

C ++标准N3936声明:

  

范围   resolution operator ::(5.1)可用于显式引用直接或间接基本成员。这允许   访问已在派生类中重新声明的名称。派生类本身可以充当基类   受访问控制;

ZZ不是命名空间而是类。通过更改

来修复它
using ZZ::print1;
print1();

ZZ::print1();

阅读此How to call a parent class function from derived class function?

答案 1 :(得分:1)

仅仅因为您可以使用ZZ::语法,ZZ是命名空间。 ::是一个作用域解析运算符,可以与命名空间作用域以及类作用域或枚举作用域一起使用。在您的情况下,ZZ::指的是类ZZ的范围。

此外,语言规范指出

  

7.3.3 使用声明

     

8 类成员的 using-declaration 应为 member-declaration

表示引用类成员的using声明不能出现在本地范围内。它只能在课堂范围内使用。

这就是为什么在上一个代码示例中使用声明成功编译的原因。

答案 2 :(得分:-1)

正如@Cheers已经指出的那样,你不需要在这里使用“using_declaration”,因为该函数无论如何都可用于派生类,因为它的“公共”访问规范。

如果您仍想使用它,则应将外部使用移至功能范围。 (http://en.cppreference.com/w/cpp/language/using_declaration#In_class_definition