#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
时,我不知道为什么会发生此错误。
答案 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)