/放在命名空间中的一个类 vector.h
namespace vector_namespace {
class Vector {
public:
enum class Mode { Rect, Pol };
Vector();
Vector(double x, double y, Mode mode = Mode::Rect);
friend std::ostream& operator<<(std::ostream& os, const Vector& vector);
private:
double X;
double Y;
double Mag;
double Ang;
Mode Mode;
};
}
/vector.cpp
namespace vector_namespace {
Vector::Vector(const double x, const double y, const enum Mode mode) {
Mode = mode;
if (mode == Mode::Pol) {
Mag = x;
Ang = y;
SetX();
SetY();
}
else if (mode == Mode::Rect) {
X = x;
Y = y;
SetMag();
SetAng();
}
else {
X = Y = Mag = Ang = 0.0;
Mode = Mode::Rect;
}
}
std::ostream& operator<<(std::ostream& os, const Vector& vector) {
if (vector.Mode == Vector::Mode::Rect) {
os << "(x,y) = (" << vector.X << ", " << vector.Y << ")";
}
else if (vector.Mode == Vector::Mode::Pol) {
os << "(m,a) = (" << vector.Mag << "," << vector.Ang * (45.0 / atan(1.0)) << ")";
}
else {
os << "Vector object mode is invalid";
}
return os;
}
}
上面的代码operator<<函数可以成功编译
/vector.cpp
namespace vector_namespace {
Vector::Vector(const double x, const double y, const enum Mode mode) {
Mode = mode;
if (mode == Mode::Pol) {
Mag = x;
Ang = y;
SetX();
SetY();
}
else if (mode == Mode::Rect) {
X = x;
Y = y;
SetMag();
SetAng();
}
else {
X = Y = Mag = Ang = 0.0;
Mode = Mode::Rect;
}
}
}
std::ostream& vector_namespace::operator<<(std::ostream& os, const Vector& vector) {
if (vector.Mode == Vector::Mode::Rect) {
os << "(x,y) = (" << vector.X << ", " << vector.Y << ")";
}
else if (vector.Mode == Vector::Mode::Pol) {
os << "(m,a) = (" << vector.Mag << "," << vector.Ang * (45.0 / atan(1.0)) << ")";
}
else {
os << "Vector object mode is invalid";
}
return os;
}
而此时无法通过编译,请问为什么下面那种不能通过编译,明明也是把函数定义在了名称空间中,和上面一种放在大括号内有什么区别呢?