[英]Does C++ namespace name and class name duplication lead to conflict?
我正在測試 C++ 的名稱查找規則。 我有一個包含 3 個文件的簡單程序:
$cat testns01.h
struct S{
static int f(){return 1;}
};
$cat testns02.h
namespace S{
static int f(){return 2;}
}
$cat testns3.cpp
#include "testns02.h" // namespace
#include "testns01.h" // struct
#include<stdio.h>
int main()
{
int i = S::f();
printf("%d\n",i);
return 0;
}
如果我編譯並運行,我會得到:
$g++ testns3.cpp && ./a.out
1
好的,我有3個問題:
如果我注釋#include "testns01.h" 行,程序將打印2,仍然可以。 所以我的第三個問題是:
- 類名和命名空間之間的名稱“S”重復不沖突?
他們是這樣。
- 當兩者都具有名稱“S”時,似乎“struct S”具有更高的優先級
它沒有。 (往下看)
- c++ 標准是否談論名稱查找如何解決重復名稱重復?
是的。 引用N4140的相關部分:
§3.3.1 [basic.scope.declarative] / 4
給定單個聲明區域中的一組聲明,每個聲明都指定相同的非限定名稱,
- 它們均指同一實體,或均指函數和函數模板; 或者
- 只有一個聲明應聲明一個不是 typedef 名稱的類名或枚舉名,而其他聲明應全部引用相同的變量或枚舉數,或全部引用函數和函數模板; 在這種情況下,類名或枚舉名是隱藏的。 [注意:命名空間名稱或類模板名稱在其聲明區域中必須是唯一的。 —尾注]
我認為你不小心讓你的例子為你工作,因為你重復了包含守衛。 我能夠從問題中重現S
類的“偏好”:
#ifndef FOO
#define FOO
struct S{
static int f(){return 1;}
};
#endif
#ifndef FOO
#define FOO
namespace S{
static int f(){return 2;}
}
#endif
#include<stdio.h>
int main()
{
int i = S::f();
printf("%d\n",i);
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.