Я хочу переместить класс в другое пространство имен, но пусть пользователь некоторое время использует старое пространство имен (пользователь будет знать, что он устарел).
Я имел:
namespace vx {
class vec3
{
public:
vec3(double a, double b, double c);
double length();
vec3 operator+(const vec3& rhs) const;
};
}
Теперь у меня есть:
namespace vx
{
class vec3
{
public:
vec3(double a, double b, double c) : v(a, b, c) {}
vec3(Math::vec3 iVec) : v(iVec) {}
Math::vec3 operator=(const Math::vec3& iVec);
operator Math::vec3() { return v; }
operator Math::vec3() const { return v; }
private:
Math::vec3 v;
};
}
namespace Math {
class vec3
{
public:
vec3(double a, double b, double c);
double length();
};
}
Math::vec3 operator+(const Math::vec3& lhs, const Math::vec3& rhs);
Преобразуя унарный operator-(const vec3&) const
в двоичный Math::operator-(const Math::vec3&, const Math::vec3&);
Я исправил много проблем, но теперь у меня все еще проблема с Math :: vec :: length()
В некотором старом кодексе у меня есть
...
vx::vec3 v(1,2,3);
double l = vec3.length(); // The implicit conversion doesn't work here!
Как я могу достичь своей цели?
Использовать псевдоним пространства имен:
namespace vx = Math;
ОБНОВЛЕНО:
Если вы не можете заменить целые пространства имен vx
через псевдоним пространства имен,
вы можете заменить в нем только класс vx::vec3
:
namespace Math {
class vec3 {
// ...
};
}
namespace vx {
using Math::vec3;
}
ОБНОВЛЕНО 2-й:
Если у вас все еще есть проблемы с "декларацией вперед",
Как насчет этого:
namespace Math {
class vec3 {
// ...
};
// all other classes in vx namespace
using vx::vec1;
using vx::vec2;
}
#define vx Math
vx::vec3
:double length() const { return v.length(); }
....Math::vec3
фиксированной версией устаревшегоvx::vec3
или же эти два класса идентичны?