這是我能想到的最小的包含示例。 首先是班級的標題。只要使用< <運算符,此類應該只打印它包含的一倍。如何超載運算符<<從命名空間內
#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
我在做什麼錯?
親切的問候, 里斯
您可以進一步剝離它,因爲它沒有'value',只是[嘗試]打印一個靜態值! –
作爲一個提示,你不需要'#pragma once'和標頭守衛#ifndef ... #define ....#endif' –