Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在typedef中使用相同的名称,并从命名空间中使用_C++_Namespaces_Language Lawyer_Typedef_Ambiguous - Fatal编程技术网

C++ 在typedef中使用相同的名称,并从命名空间中使用

C++ 在typedef中使用相同的名称,并从命名空间中使用,c++,namespaces,language-lawyer,typedef,ambiguous,C++,Namespaces,Language Lawyer,Typedef,Ambiguous,示例代码: struct X { void f() {} }; typedef X A; namespace N { struct A { void g() {} }; }; using N::A; int main() { A a; a.f(); } 这段代码编译正确,而且A创建一个X,而不是N::a 标准中的哪条规则涵盖了这种行为?我期待着一个A的错误将是不明确的。如果我将第一个结构命名为A而不是X,并删除typedef,那么我确实会得到这样一个错误。(g+

示例代码:

struct X { void f() {} };
typedef X A;

namespace N { 
    struct A { void g() {} };
};

using N::A;

int main()
{
    A a;
    a.f();
}
这段代码编译正确,而且
A创建一个
X
,而不是
N::a

标准中的哪条规则涵盖了这种行为?我期待着一个
A的错误将是不明确的。如果我将第一个结构命名为
A
而不是
X
,并删除typedef,那么我确实会得到这样一个错误。(g++8.3)

根据
using N::A
将非限定的
A
引入using声明出现的声明区域

。。。非限定id在声明性区域中声明,其中using声明作为using声明符引入的每个声明的同义词出现

因此,模糊性由

由于using声明是一个声明,所以对同一声明区域中同名声明的限制也适用于using声明

给定单个声明区域中的一组声明,每个 指定相同的非限定名称

  • 它们应全部引用同一实体,或全部引用功能和功能模板;或
  • 仅一个声明应声明不是typedef名称的类名或枚举名,其他声明应全部引用同一变量、非静态数据成员或枚举器,或全部引用函数和函数模板;在这种情况下,类名或枚举名是隐藏的

OP中的
typedef
声明和using声明都没有填充任何一个项目符号,因此同一声明区域中的这对声明格式不正确。

Clang表示对
A
的引用不明确。
使用N::A
没有指定非限定名称,所以我不确定第二个引号是如何应用的?(也没有编译器报告使用N::A;
错误,尽管这可能是一个bug)@M-
使用N::A
将非限定名称
A
添加到它出现的声明性区域中。但也许是查找应该引起注意。我会仔细检查的。在名称查找中找不到任何内容。因此,我不确定它在引入名称或查找名称时是否会发出诊断,但我确定上面的两个项目符号会使其格式错误。