Jor*_*ens 3 c++ namespaces operator-overloading operator-keyword
这是我能想到的最小的包含的例子.首先是班级的标题.只要使用<<运算符,该类就应该只打印它包含的一个double.
#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
Run Code Online (Sandbox Code Playgroud)
现在是.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;
}
Run Code Online (Sandbox Code Playgroud)
最后,main.cpp
#include "euro.h"
#include <iostream>
using namespace EU;
int main()
{
auto e = Euro(3.14);
std::cout << e << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我使用以下编译时:
g++ -std=c++11 *.cpp
Run Code Online (Sandbox Code Playgroud)
它吐出以下错误:
/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
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
亲切的问候,Joris
Lig*_*ica 10
你期望using namespace EU;将所有后续代码放在里面namespace EU,但它不会(否则你int main也会在命名空间中!).这只是将该命名空间中的内容带入范围.
这意味着您在命名空间内声明了友元函数,但在全局范围内定义了一个新函数.对前者的调用将失败,因为它没有定义.
删除using namespace,并包裹namespace EU { }所有内容euro.cpp.