Пространство имен + перегруженный оператор std :: ostream << - PullRequest
5 голосов
/ 08 октября 2011

Я пытаюсь создать класс Vector3D в своем приложении c ++. Для всей моей программы я использую пространство имен. В этом пространстве имен я объявил мой класс Vector3D и перегруженный оператор << для него следующим образом: </p>

namespace space
{
    class Vector3D
    {
      public:
        float x, y, z;

        Vector3D(float _x = 0, float _y = 0, float _z = 0);
        Vector3D(const Vector3D & _vector);

        Vector3D & operator=(const Vector3D & _vector);
        Vector3D operator*(float _scalar);
        Vector3D operator*(const Vector3D & _vector); //CROSS PRODUCT

        float magnitude() const;
        float magnitude2() const; //FOR SPEED
        Vector3D normalize() const;
    };

    std::ostream & operator<<(std::ostream &, const Vector3D &);
}

Он тоже отлично компилируется. Моя проблема состоит в том, чтобы поставить Vector3D на место, я должен вручную позвонить

space::operator<<(cout, vector);

это боль. Я хотел бы попытаться избежать «использования пространства имен», потому что мне нравится префикс для всех остальных объектов в «пространстве имен».

Мой последний вопрос: есть ли способ вызвать перегруженную операторную функцию внутри пространства имен без использования этого пространства имен?

Спасибо за помощь.

1 Ответ

9 голосов
/ 08 октября 2011

Моя проблема состоит в том, чтобы настроить Vector3D, я должен вручную вызвать space :: operator << (cout, vector); </p>

Вы не знаете, это то, что ADL (Аргумент)поиск имени, также известный как поиск Кенига) о.Этого должно быть достаточно, чтобы сделать

cout << vector;

Если это не сработает, либо вы работаете с древним компилятором, либо делаете что-то еще неправильно.

...