2

考虑使用以下头文件 (c++):myclass.hpp

#ifndef MYCLASSHPP_
#define MYCLASSHPP_

namespace A {
namespace B {
namespace C {

class myclass { /* Something */ };

myclass& operator+(const myclass& mc, int i);

}}}

#endif

考虑实现文件:myclass.cpp

#include "myclass.hpp"
using namespace A::B::C;

myclass& operator+(const myclass& mc, int i) {
   /* Doing something */
}

考虑主文件:main.cpp

#include "myclass.hpp"

int main() {
   A::B::C::myclass el = A::B::C::myclass();
   el + 1;
}

好吧,链接器告诉我有一个未定义的引用A::B::C::operator+(A::B::C::myclass const&, int)

这里有什么问题?

4

3 回答 3

6

仅仅因为您using namespace A::B::C在实现文件中并不意味着其中声明的所有内容都会自动在A::B::C命名空间中(否则,如果您有using多个命名空间,所有定义都会变得不明确)。

myclass.cpp 应该类似于:

namespace A {
namespace B {
namespace C {
    myclass operator+(const myclass& mc, int i) {
        // ...
    }
}

或者(我发现这个更清洁):

using namespace A::B::C;

myclass A::B::C::operator+(const myclass& mc, int i) {
    // ...
}

目前,编译器认为您已经operator+在命名空间中声明了一个函数A::B::C,并定义了一个根本不在命名空间中的不同函数,从而导致您的链接错误。

于 2012-07-06T04:10:50.950 回答
5

using namespace指令更改名称搜索顺序。它不会改变定义的放置位置。

operator+在错误的命名空间中定义。

于 2012-07-06T04:11:19.063 回答
1

“using”关键字只对解析被调用的方法有用。定义方法时不能使用。您的语句实际上只是定义了全局命名空间中的方法。你的定义应该是:

A::B::C::myclass A::B::C::operator+(const myclass& mc, int i) {
   /* Doing something */
}

当您调用该方法时,以下两个都做同样的事情:

using namespace A::B::C;
myclass tmp;
tmp + 1;

-或者-

A::B::C::myclass tmp;
tmp + 1;

希望这可以帮助...

于 2012-07-06T04:22:14.250 回答