我是命名空间的新手,正在C++ Primer中尝试这个
#include<iostream>
namespace Jill
{
double bucket;
double fetch;
struct Hill{ };
}
double fetch;
int main()
{
using namespace Jill;
Hill Thrill;
double water = bucket;
//double fetch; //<<<<<<<<<<<<//
std::cin>> fetch;
std::cin>> ::fetch;
std::cin>> Jill::fetch;
std::cout<<"fetch is "<<fetch;
std::cout<<"::fetch is "<< ::fetch;
std::cout<<"Jill::fetch is "<< Jill::fetch;
}
int foom()
{
Jill::Hill top;
Jill::Hill crest;
}
当标记的行//<<<<<<<<<<<<//
没有被评论时,我会得到预期的结果。即
local
变量隐藏了global
and Jill::fetch
。但是当我注释掉它时,还有 2 fetch left 。global fetch
和Jill::fetch
。并且编译器给出了错误
namespaceTrial1.cpp:17:13: error: reference to ‘fetch’ is ambiguous
namespaceTrial1.cpp:9:8: error: candidates are: double fetch
namespaceTrial1.cpp:5:9: error: double Jill::fetch
namespaceTrial1.cpp:20:26: error: reference to ‘fetch’ is ambiguous
namespaceTrial1.cpp:9:8: error: candidates are: double fetch
namespaceTrial1.cpp:5:9: error: double Jill::fetch
我的问题是为什么编译器会感到困惑,这会导致歧义?为什么它不假设fetch
只是Jill::fetch
,因为我using namespace Jill
在开头添加了main()
如果我using Jill::fetch;
在 main 开头使用声明性,问题就解决了。因为using Jill::fetch
使它好像它已在该位置声明。所以,它就像有一个local fetch
变量。[我是正确的吗?] 为什么using declaration
表现得好像变量是在那个位置声明的而using directive
不是?