如何重载运算符<<来自命名空间

时间:2016-04-21 16:56:14

标签: c++ namespaces operator-overloading operator-keyword

这是我能想到的最小的包含例子。 首先是班级的标题。只要<<<<<<<<<<<使用运算符。

#pragma once
#ifndef EURO_H
#define EURO_H

#include <ostream>

namespace EU
{
   class Euro final
   {
   public:
        explicit Euro(double value);
        virtual ~Euro() = default;

        double getValue() const;

        friend std::ostream& operator<<(std::ostream &os, const Euro &euro);

    private:
        double m_value;
    };
}

#endif // EURO_H

现在是.cpp

#include "euro.h"

using namespace EU;

Euro::Euro(double value)
{
    m_value = value;
}

double Euro::getValue() const
{
    return m_value;
}

std::ostream& operator<<(std::ostream &os, const Euro &euro)
{
    os << euro.getValue() << "EUR";
    return os;
}

最后,main.cpp

#include "euro.h"

#include <iostream>

using namespace EU;

int main()
{
    auto e = Euro(3.14);
    std::cout << e << std::endl;
}

然而,当我使用:

进行编译时
g++ -std=c++11 *.cpp

它吐出以下错误:

/tmp/ccP7OKC5.o: In function `main':
main.cpp:(.text+0x35): undefined reference to `EU::operator<<(std::ostream&, EU::Euro const&)'
collect2: error: ld returned 1 exit status

我做错了什么?

亲切的问候, 里斯

2 个答案:

答案 0 :(得分:10)

您希望using namespace EU;将所有后续代码放在namespace EU中,但它不会被取消(否则您的int main也会在命名空间中!) 。这只是将该命名空间中的内容带入范围。

这意味着您在命名空间内声明了友元函数,但在全局范围内定义了 new 函数。对前者的调用将失败,因为它没有定义。

删除using namespace,并将namespace EU { }包裹在euro.cpp中的所有内容中。

答案 1 :(得分:0)

从此处更改您的cpp文件:

#include "euro.h"

using namespace EU;

Euro::Euro(double value)
{
    m_value = value;
}

double Euro::getValue() const
{
    return m_value;
}

std::ostream& operator<<(std::ostream &os, const Euro &euro)
{
    os << euro.getValue() << "EUR";
    return os;
}

到此:

#include "euro.h"

namespace EU {  

Euro::Euro(double value)
{
    m_value = value;
}

double Euro::getValue() const
{
    return m_value;
}

std::ostream& operator<<(std::ostream &os, const Euro &euro)
{
    os << euro.getValue() << "EUR";
    return os;
}

} // namespace EU

这将此cpp文件中的代码定义在命名空间内。您之前所做的是声明您的命名空间在该文件的全局范围内使用,因为您没有将源代码定义在命名空间内。