[英]namespace validity in c++
我對C ++中的名稱空間有一個簡單的問題。 當我編譯以下幾段代碼時出現錯誤。 我不明白為什么。 感謝您的任何幫助!
#include <iostream>
using namespace std;
int x=100;
namespace first
{
int x=1;
}
namespace second
{
int x=2;
}
int main(){
{
using namespace first;
cout<<x<<endl;
}
{
using namespace second;
cout<<x<<endl;
}
cout<<x<<endl;
}
如果我注釋掉在全局范圍內聲明的x和最后一個語句。 工作正常。 但是在我看來,第一個x是在std命名空間中聲明的,並且在聲明了代碼塊后,在main中使用名稱空間的first和second將無效(因此,命名空間將再次被std)。 因此,上面的代碼應該可以工作。 我哪里錯了?
但在我看來,第一個x是在std命名空間中聲明的
你的想法錯了。 using namespace std
使std
中的名稱在全局名稱空間中可用,並不意味着在全局名稱空間中聲明的名稱在std
。
x
在全局名稱空間中聲明。
所以命名空間將再次被std
不,文件中沒有任何內容位於名稱空間std
,只有<iostream>
的內容位於名稱空間std
。
錯誤是,當您嘗試使用x
,您可能要引用的作用域中有兩個不同的變量::x
和first::x
,所以它是模棱兩可的。 您可以使用using聲明而不是using指令來消除歧義:
{
using first::x;
cout<<x<<endl;
}
這表示在該范圍內x
指的是first::x
在這種情況下,x變量是不明確的。 編譯器找不到要使用的x。 您可以這樣寫。
#include <iostream>
using namespace std;
int x=100;
namespace first
{
int x=1;
}
namespace second
{
int x=2;
}
int main(){
{
cout<<first::x<<endl;
}
{
cout<<second::x<<endl;
}
cout<<x<<endl;
}
現在您的代碼將被編譯。
第一個x不在std名稱空間中。 如果這樣定義,它將僅位於std命名空間中:
namespace std
{
int x;
}
因為它不在該命名空間中,所以在程序中稍后會與對x的引用匹配,並且當另一個聲明x的命名空間也正在使用時,此類引用就變得模棱兩可(例如在第一/第二個命名空間中使用)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.