Я делал некоторую работу с классами, которым нужно перегружать некоторые их операторы (=, ==, +,! = И т. Д.) Я пишу операторные функции, но иногда они не вызываются, или компилятордействует так, как будто его даже не существует.например:
class Thing{
public:
Thing& operator=(const Thing& _other){
// implementation
}
bool operator==(const Thing& _other){
// implementation
}
Thing& operator+(const Thing& _other){
// implementation
}
};
это включает в себя другие функции-члены класса (конструктор (по умолчанию), конструктор (копирование), деструктор и т. д.), но иногда метод игнорируется.
void Foo(Thing & thing1, Thing & thing2){
//snip
if(thing1 == thing2){
//do some stuff
}
//snip
Thing tempThing();
thing1 = thing2 + &tempThing;
//snip
}
в Visual-Studio я иду на компиляцию, и он считает, что нет никакого оператора, который принимает левый аргумент Thing, а затем, если я указываю thing2->operator+(&tempThing);
, тогда он работает, это сбивает с толку, потому что он должен разрешить этот операторфункция только благодаря разрешению языка
, если существует функция Class operator#(Class)
, и аргументы могут быть преобразованы в соответствующие типы, тогда все, что нужно, это использовать оператор, и компилятор заменит его наоператор-функция или, по крайней мере, вызов операторной функции.
thing1 = thing2 + thing3; // written line
thing1.operator=(thing2.operator+(thing3));
зачем мне указывать оператор-функцию.не должен ли компилятор сделать это для меня.
РЕДАКТИРОВАТЬ: это вопрос общего поведения, а не фактической правильности кода.даже когда я пишу операторы, так как они должны по какой-то причине указывать фактический оператор () вместо возможности использовать символ.(Я должен был сделать это с прямыми примерами, а также скопированным символом для персонажа, но иногда это работает)