const Foo operator+(const Foo& a, const Foo& b)
- правильная подпись.Это должна быть дружественная функция, если данные являются частными и не имеют функций-мутаторов (то есть «сеттеров»).
Операторы должны быть глобальными функциями, а не членами, чтобы первый параметр былпо принуждению к вашему типу.Например, если int
может быть приведен к Foo
, это допустимо с помощью указанной выше подписи: 1 + foo
.
Редактировать: код, демонстрирующий, почему оператор + должен быть глобальным ...
struct Foo {
int i;
Foo(int i) : i(i) {}
const Foo operator+(const Foo& a) {
return Foo(this->i + a.i);
}
};
int main() {
Foo f(5);
f + 1;
1 + f; // g++ 4.5 gacks here.
return 0;
}
Вот ошибка:
main.cpp: In function ‘int main()’:
main.cpp:14:9: error: no match for ‘operator+’ in ‘1 + f’