为啥使用命名空间在我的 C++ 项目中不起作用?
Posted
技术标签:
【中文标题】为啥使用命名空间在我的 C++ 项目中不起作用?【英文标题】:Why using namespace doesn't work in my C++ project?为什么使用命名空间在我的 C++ 项目中不起作用? 【发布时间】:2014-01-19 12:09:35 【问题描述】:经过大量努力,我可以(详情在这里FLTK version 1.3.2, Visual studio 2012 and the first example of Stroustrup's PPP book)运行以下代码;
#include <Simple_window.h>
#include <Graph.h>
//*********************************************
int main()
using namespace Graph_lib;
Point tl(100,100);
Simple_window win(tl,600,400,"Canvas");
Graph_lib::Polygon poly;
poly.add(Point(300,200));
poly.add(Point(350,100));
poly.add(Point(400,200));
win.attach(poly);
win.set_label("Canvas");
win.wait_for_button();
但是对于Polygon poly;
,我应该使用Graph_lib::
,而由于我在代码主体的顶部(就在main
函数下方)添加了语句using namespace Graph_lib;
,所以应该不需要使用多边形的Graph_lib::
。但实际上不使用它我得到 ambiguous symbol 错误。即使我删除了该声明(using namespace Graph_lib;
),我也没有收到任何错误。我的问题是,为什么该语句不适用于该代码,而我必须使用 Graph_lib::
?
【问题讨论】:
全局命名空间中可能还有另一个Polygon
符号?
全局命名空间是什么意思?
【参考方案1】:
您很可能还有其他名称为Polygon
。命名空间的存在是为了避免此类问题。
这是一个简化的例子:
namespace Foo
struct Bar ;
void Bar()
int main()
using namespace Foo; // I really really know what I am doing, seriously!
Bar b; // Oh dear.
在输出中:
错误:对“Bar”的引用不明确
这是using namespace X
反成语陷阱的一个很好的例子。这确实应该避免,或者至少限制在最小的范围内。
【讨论】:
如果您愿意明确提及“所以这就是为什么不应该(ab)使用命名空间指令”... @H2CO3 完成(避免我通常的“永远不要说using namespace X
”的咆哮,这总是会导致一连串的 cmets)。
谢谢! (当然这会导致评论斗争——不是每个人都可以正确或有经验。如果有人不正确,如果你告诉他永远不要use namespace X
... :/ ,他会认为这是个人的冒犯。)
所以,using namespace X; and then Polygon poly; with X::Polygon poly; 不等于彼此,是吗?
@abbasi 对。如果在同一范围内还有其他名为 Polygon
的东西,第一个版本会导致歧义,而第二个版本不会。【参考方案2】:
很可能,在全局命名空间中声明了另一个 Polygon,或者在您已经“使用”的某个命名空间中声明了另一个 Polygon(例如,如果您在另一个包含的标头中有 using namespace XXX;
,这不是一个好习惯,类似于 @ 987654322@ 已声明)。
我可以建议你作为一个快速的解决方案(如果你真的想在没有“Graph_lib::”的情况下使用 Graph_lib 的多边形,是
using Graph_lib::Polygon;
代替(或旁边)
using namespace Graph_lib;
【讨论】:
以上是关于为啥使用命名空间在我的 C++ 项目中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章