为啥使用命名空间在我的 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++ 项目中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 jquery.validation.js 在我的项目中不起作用?

为啥绝对路径在我的项目中不起作用?

为啥捆绑包在我的 asp.net mvc 项目中不起作用?

为啥 C++ CLI 索引属性在 C# 中不起作用?

为啥“发布”方法在我的 django 应用程序中不起作用?

为啥 Ctrl + A 在 CEdit 中不起作用?