将命名空间赋予C ++中的现有库

时间:2015-04-10 07:52:46

标签: c++ namespaces

C ++中的某些库并没有像stl那样使用命名空间。与ncurses一样,可以在没有命名空间的情况下调用可用的函数。它具有move ()功能,可以全局访问。现在,我在我的类文件中使用ncurses库,该文件将move作为其成员函数。如果我像这样写我的课:

#include <ncurses.h>

class MyClass {
    public:
        void move (int x, int y) {
            // moving
        }
        void do_something (int x, int y) {
            move (x, y);
            // do something
        }
}

我不知道move ()将调用哪个MyClass函数。我认为如果可以为ncurses库提供命名空间,问题就会消失,因此可以使用(例如)ncurses::move ()而不仅仅是move ()。是否有可能给它命名空间?如果没有,如果你发现这样的事情你会怎么做(当然不改变功能名称)?

2 个答案:

答案 0 :(得分:2)

  

我不知道move ()将调用哪个MyClass函数。

成员函数,因为它在较窄的范围内。非限定名称查找从本地范围开始,向外工作直到找到匹配项。所以这里它将查看函数的块范围;然后搬到课堂上;然后找MyClass::move并停在那里。它不会考虑课外的全局命名空间。

  

是否可以给它命名空间?

您可以将名称限定为::move以指定全局命名空间。

答案 1 :(得分:2)

在这种情况下,您可以完全限定呼叫,而不是依赖于名称查找,它基本上可以找到&#34;最近的&#34;匹配,像这样:

::move(x, y);

这将在顶层寻找move,找到ncurses,no-namespace,version。

添加ncurses命名空间,不是真的。你可以尝试:

namespace ncurses {
#include <ncurses.h>
}

但它真的很讨厌,几乎肯定不会正常工作。另一种方法是创建一个包装器头,手动将您感兴趣的所有函数添加到命名空间中,如:

// wrapped_ncurses.h
#ifndef WRAPPED_NCURSES_H
#define WRAPPED_NCURSES_H
#include <ncurses.h>
namespace ncurses {
    using ::move;
}
#endif

当然,您可以根据自己的喜好选择为整个库创建一个C ++包装器(or try to find an existing one)。