2012-04-28 5 views
1

У меня есть что-то вроде этого:Использование `this` в операторов

CLASS CLASS::operator|(CLASS& right) { 
    return binop(*((CLASS*) this), right, OP_OR); 
} 

CLASS только некоторый класс. Прототип бинарным оператором является

CLASS binop(CLASS& left, CLASS& right, OP op);

Это все работает отлично и компилирует с помощью Visual C++ 2010, но не в г ++ с ошибкой:

someheader.h: In member function 'void CLASS::set(int64_t)': 
someheader.h:469:29: error: no match for 'operator|' in '*(CLASS*)this | CLASS(bit)' 
someheader.h:469:29: note: candidate is: 
someheader.h:376:1: note: CLASS CLASS::operator|(CLASS&) 
someheader.h:376:1: note: no known conversion for argument 1 from 'CLASS' to 'CLASS&' 

Теперь у меня возникли проблемы только проездом текущий объект (* this) в качестве некоторого параметра, поэтому я явно изгоняю его, чтобы удалить определитель const на указателе, который отлично работает и, кажется, обманул компилятор Visual C++, чтобы принять его как обычный указатель. g ++, похоже, не нравится. Если я удалю бросок, он все равно даст мне ошибку, так как this является const-квалифицированным. То, что я делаю с левым и правым размером операторов, требует, чтобы оба изменялись.

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

+2

Что с funky '* ((CLASS *) this)', если функция является членом CLASS? – chris

+0

Как я уже сказал, компилятор не понравился, когда я просто использовал '* this', поэтому я сделал бросок, чтобы сделать его счастливым. – Pochi

+2

О, это не должно быть так. Возможно, ваша функция 'set' будет стоить того, так как это ошибка. На самом деле, существует ли проблема с 'CLASS & right', которая является' const CLASS & right'? – chris

ответ

6

Visual Studio нарушает стандарт здесь.

Ваш правый аргумент является временным и, согласно правилам C++, временное не может соответствовать неконстантной ссылке.

+0

Временное должно соответствовать как ссылка в вызываемом. Это то, что вы говорите, - что я должен сначала создать объект в отдельной строке? Мне просто интересно, но есть ли шанс, что вы можете указать, где в стандарте это сказано? – Pochi

+0

Ну, я думаю, это исправлено ... Спасибо! – Pochi

+0

временно не может связываться с несимметричной ссылкой. MSVC даже говорит вам, что он нарушает это правило при компиляции. Посмотрите на предупреждения. –

1

Ты называешь operator| что-то вроде этого:

int bit = 0x02; 
CLASS result = *this | (CLASS)bit; 

Ваш оператор принимает ссылку.

CLASS CLASS::operator| (CLASS &right); 

Чтобы решить эту проблему для GCC, я обнаружил, что либо называя это так:

CLASS result = *this | (CLASS &)bit; 

или определения оператора, как это:

CLASS CLASS::operator| (CLASS &&right); //C++11 

И заставила его вернуть правильный результат назад. Я не могу гарантировать, что один или другой решение.

+0

bboth of the wrong, поскольку они изменяют «право» вместо копии права. –

+0

@MooingDuck, из того, что я видел, это то, чего хотел OP. – chris

+0

Я неправильно читаю второй, который должен работать нормально. И я подумал, что бит - это класс, который бы сделал код совершенно другим.Этот ответ хороший. –

Смежные вопросы