簡體   English   中英

C++ 命名空間名稱和類名稱重復會導致沖突嗎?

[英]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個問題:

  1. 類名和命名空間之間的名稱“S”重復不沖突?
  2. 當兩者都具有名稱“S”時,似乎“struct S”具有更高的優先級

如果我注釋#include "testns01.h" 行,程序將打印2,仍然可以。 所以我的第三個問題是:

  1. c++ 標准是否討論名稱查找如何解決重復名稱重復?
  1. 類名和命名空間之間的名稱“S”重復不沖突?

他們是這樣。

  1. 當兩者都具有名稱“S”時,似乎“struct S”具有更高的優先級

它沒有。 (往下看)

  1. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM