Перегрузка <

#c

Вопрос:

У меня есть занятие, и я хочу перегрузить lt;:

 class Vector3 {  int x;  int y;  int z; public:  Vector3(int a, int b, int c) : x{a}, y{b}, z{c} {}  Vector3 operator (const Vector3amp; v);  friend std::ostreamamp; operatorlt;lt;(std::ostreamamp; ost, const Vector3amp; v);      };  

Но в основном я хочу иметь доступ к элементам данных, поэтому здесь я сделал это с помощью функции друга и просто определил функцию в другом файле:

 std::ostreamamp; operatorlt;lt;(std::ostreamamp; ost, const Vector3amp; v) {  return ost lt;lt; '(' lt;lt; v.x lt;lt; ',' lt;lt; v.y lt;lt; ',' lt;lt; v.z lt;lt; ')'; }  

Но мой вопрос в том, как это происходит, когда я не использую функцию друга и просто объявляю функцию так:

 std::ostreamamp; operatorlt;lt;(std::ostreamamp; ost);  

Затем определите его в другом файле:

 std::ostreamamp; Vector3::operatorlt;lt;(std::ostreamamp; ost) {  return ost lt;lt; '(' lt;lt; x lt;lt; ',' lt;lt; y lt;lt; ',' lt;lt; z lt;lt; ')'; }  

Когда я пытаюсь на самом деле использовать его

 int main() {  Vector3 u(2,4,3);  std::cout lt;lt; u;  }  

Это просто говорит:

 gt; no operator matches these operands operand types are: gt; std::ostream lt;lt; Vector3  

Но если я это сделаю u.operatorlt;lt;(std::cout); Значит, это работает? Но почему? Я думал, что std::cout lt;lt; u; в основном это то же самое, что u.operatorlt;lt;(std::cout) ;

Комментарии:

1. Твое последнее предложение, ты все понял наоборот. std::cout lt;lt; u это на самом деле cout.operatorlt;lt;(u)

Ответ №1:

 A a; B b; a lt;lt; b;  

Компилятор ищет элемент operatorlt;lt; A здесь, т. е. Если A::operator(B constamp;) он существует, приведенный выше код использует его, но B::operatorlt;lt;(Aamp;) не рассматривается.

Для вашего кода это означает, что требуется оператор-член std::ostream::operatorlt;lt;(Vector3 constamp;) , который вы не можете добавить, так std::ostream как он определен в стандартной библиотеке. Ваш единственный выбор здесь-это бесплатная функция.

Комментарии:

1. Но компилятор также смотрит, есть ли операторlt; потому что это может быть функция-член или свободная функция, верно?

Ответ №2:

Порядок имеет значение. Указанная вами перегрузка определяет u lt;lt; cout и не cout lt;lt; u определяет .