Перегруженные функции не принимают объекты ни по значению, ни по ссылке, но принимают разыменованный указатель на объект - PullRequest
0 голосов
/ 27 июня 2019

Примечание заранее: Проблема связана с векторным классом, реализованным мной, и не имеет ничего общего с std :: vector 1004

. Рассмотрим следующее перегрузка оператора:

//in the Vector-class(declaration)
friend Vector operator+(const Vector& a, const Vector& b);

//outside the Vector-class(implementation)
Vector operator+(const Vector& a, const Vector&b) {
//...
}

Он принимает ссылки на два вектора и возвращает их сумму.Теперь, когда я пытаюсь что-то вроде следующего:

Vector foo();
Vector bar();

Vector byVal = foo + bar; //using objects
Vector byRef = &foo + &bar; //using address

, в обоих случаях моя IDE сообщает мне следующее:

выражение должно иметь целочисленный или незавершенный тип enum

Inво втором случае это имеет смысл, потому что я мог бы передать возвращаемый указатель только тогда, когда вызываемая функция взяла бы указатель, а для функции, которая берет ссылку, я могу передать сам объект, но я не понимаю, почему просто использование объекта здесь невозможно.

Что делает меня более запутанным, так это то, что следующее представляется возможным:

Vector* foo = new Vector();
Vector* bar = new Vector();

Vector foobar = *foo + *bar;

То есть я могу использовать разыменованные указатели с перегруженным оператором.

В чем причина этого поведения и как я должен использовать свой перегруженный оператор в этом случае?

Ответы [ 2 ]

2 голосов
/ 27 июня 2019
Vector foo();
Vector bar();

Это не объявления переменных.Это объявления функций.Это функции, которые возвращают Vector и принимают пустой список аргументов.

Учитывая то, что вы не можете добавлять функции вместе, и вы не можете добавлять указатели на функции вместе, foo + bar и &foo + &bar оба плохо сформированы.

Чтобы инициализировать значение переменной, вы можете использовать одно из следующих:

Vector foo{};        // uniform initialsation
auto bar = Vector(); // copy initialisation syntax

Я хотел вызвать конструктор Vector, который не требует каких-либоАргументы

Действительно.Объявление функции без аргументов и объявление переменной с пустым списком инициализаторов неоднозначно.Это разрешается правилом языка, которое говорит, что если часть кода может быть синтаксически либо объявлением функции, либо чем-то еще, то это объявление функции.

1 голос
/ 27 июня 2019

Если функция помечает параметр как &, то объект, переданный в качестве аргумента, будет передан по ссылке. Адрес объекта берется неявно , поэтому вам не нужно (на самом деле не нужно) писать & перед передачей аргумента объекта.

Обратите внимание, что Vector foo(); объявляет функцию, а не объект. Вот почему ваш компилятор жалуется на оба ваших вызова.

Vector operator+(const Vector& a, const Vector&b) {
//...
}

Vector foo;
Vector bar;

Vector byVal = foo + bar; //by reference because parameter in operator + is marked as "call by reference" 
// Wrong: Vector byRef = &foo + &bar; 
...