Перемещение класса в другое пространство имен

0

Я хочу переместить класс в другое пространство имен, но пусть пользователь некоторое время использует старое пространство имен (пользователь будет знать, что он устарел).

Я имел:

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!

Как я могу достичь своей цели?

  • 0
    Вы можете добавить к vx::vec3 : double length() const { return v.length(); } ....
  • 0
    Является ли Math::vec3 фиксированной версией устаревшего vx::vec3 или же эти два класса идентичны?
Показать ещё 1 комментарий
Теги:

1 ответ

0

Использовать псевдоним пространства имен:

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
  • 0
    К сожалению, пространство имен vx уже используется и не может быть псевдонимом.
  • 0
    Существует еще некоторая проблема, если у пользователя есть предварительное объявление в его коде (в одном из его заголовочного файла): 'namespace vx {class vec3; }». Он получит следующую ошибку: «ошибка конфликтующего объявления» с использованием vec3 = «использование vec3 = Math :: vec3l», а «ошибка» класса vx :: vec3 »имеет предыдущее объявление как« класс vx :: vec3 »

Ещё вопросы

Сообщество Overcoder
Наверх
Меню