为什么使用命名空间在我的C ++项目中不起作用?

时间:2014-01-19 12:09:36

标签: c++ namespaces

我经过大量努力(详情请见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::,因为我已经在代码正文的顶部添加了语句using namespace Graph_lib;(正好在main函数下方)所以不应该将Graph_lib::用于 Polygon 。但实际上没有使用它我得到模糊符号错误。甚至我删除了该语句(using namespace Graph_lib;)我没有得到任何错误。我的问题是,为什么该声明不适用于该代码,我必须使用Graph_lib::

2 个答案:

答案 0 :(得分:5)

您很可能还有其他名为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反成语陷阱的一个很好的例子。这确实应该避免,或者至少局限于最小的范围。

答案 1 :(得分:0)

可能,在全局命名空间中声明了另一个Polygon,或者在某些命名空间中,您已经使用&#34; (比如你在另一个包含的标题中有using namespace XXX;,这不是一个好习惯,并且声明了XXX::Polygon之类的内容。

我可以建议你作为一个快速解决方案(如果你真的想使用Graph_lib&#39;多边形而没有&#34; Graph_lib ::&#34;,是

using Graph_lib::Polygon;

代替(或旁边)

using namespace Graph_lib;