链接器在重载运算符中完成编译过程时的C ++问题

时间:2012-07-06 04:07:13

标签: c++ namespaces operator-overloading linker-errors

考虑使用以下头文件(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)

这里有什么问题?

3 个答案:

答案 0 :(得分:6)

仅仅因为你在实现文件中using namespace A::B::C并不意味着在A::B::C命名空间中自动声明的所有内容(否则,如果你{{1},所有定义都会变得模棱两可不止一个命名空间)。

myclass.cpp应该类似于:

using

或者(我觉得这个更干净):

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+函数,并且定义了一个根本不在命名空间中的不同的函数,导致你的链接错误。

答案 1 :(得分:5)

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

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

答案 2 :(得分: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;

-OR -

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

希望这会有所帮助......