«Не удается преобразовать ‘MyClass’ в ‘bool'» Ошибка в программировании шаблонов

#c #templates

#c #шаблоны

Вопрос:

Я играю с шаблонами и попробовал следующее, но получаю «Не удается преобразовать ‘MyClass’ в ‘bool’ ошибка?

 #include "Unit2.h"
using namespace std;

template <class T>
T GetMax (T a, T b) {
  T resu<
  result = (a > b) ? a : b;
  return (result);
}

int main () {
  MyClass k1( 10, "A" );
  MyClass k2( 50, "B" );
  MyClass k3( 0,"" );
  k3 = GetMax<MyClass>(k1,k2);

  cout << k3.GetName() << endl;

  return 0;
}
//---------------------------------------------------------------------------
  

Я определил оператор> для myclass следующим образом:

 MyClassamp; MyClass::operator>(MyClass amp;rhs)
{
    MyClassamp; rkReturn = ( m_iSize > rhs.m_iSize ) ? *this : rhs;
    return rkReturn; 
}
  

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

1. Хороший вопрос, за исключением заголовка. Вы показали сообщение об ошибке и весь соответствующий код! Там даже знак вопроса!

2. @Joe: Вы получили свой ответ? Что это было?

Ответ №1:

Ваш > оператор должен возвращать a bool , а не MyClass ссылку.

Ответ №2:

Ваш operator> возвращает a MyClassamp; вместо a bool . Используя его в условном операторе, компилятор пытается принудительно преобразовать возвращаемое MyClass значение в a bool .

Изменить

 MyClassamp; MyClass::operator>(MyClass amp;rhs)
{
    MyClassamp; rkReturn = ( m_iSize > rhs.m_iSize ) ? *this : rhs;
    return rkReturn; 
}
  

Для

 bool MyClass::operator>(const MyClass amp;rhs) const
{
    return m_iSize > rhs.m_iSize;
}
  

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

1. Пока вы исправляете operator> , обратите внимание, что это должна быть const функция.

Ответ №3:

Синтаксис x ? y : z требует, чтобы x можно было преобразовать в bool тип. Вы даете ему выражение (a > b) , которое вызывает ваш оператор MyClassamp; MyClass::operator>(MyClass amp;rhs) , который возвращает a MyClass по ссылке. Компилятор не может преобразовать эту ссылку в a bool и запутывается. MyClass::operator>(MyClass amp;rhs) должен вернуть a bool .

 bool MyClass::operator>(MyClass amp;rhs) const //also, it should be a const function
{
    return m_iSize > rhs.m_iSize 
}
  

Ответ №4:

Ваш > оператор должен возвращать a bool (или что-то, что может быть автоматически преобразовано в a bool , например, an int ), а не a MyClassamp; .

Ответ №5:

Вам нужно вернуться bool из operator> .

Итак, попробуйте это:

 bool MyClass::operator>(const MyClass amp;rhs)
{
    return m_iSize > rhs.m_iSize;
}
  

Было бы лучше, если бы вы сделали это const функцией, поместив ключевое слово в правую часть функции, как показано ниже:

 bool MyClass::operator>(const MyClass amp;rhs) const 
{                                        // ^^^^^ this makes the function const
    return m_iSize > rhs.m_iSize;
}
  

Также укажите const объявление.

Ответ №6:

оператор> должен быть объявлен / определен для возврата bool, а не MyClassamp; .

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

1. Но разве это не сила шаблонов, например.. T результат; результат = (a> b) ? a: b; результат имеет тип T, который является MyClass, почему я не могу его вернуть?

2. В общем, да, возвращаемый тип метода может быть параметром шаблона. Но рассмотрим семантику «больше, чем»… любой другой тип результата, кроме bool, был бы странным.

3. @JoeSaddigh: в теренарном операторе (a > b) ? a : b; (a>b) ожидается, что результатом будет an bool , а не MyClass , и, следовательно, ваш > оператор должен возвращать a bool .

4. @Joe: a и b MyClass , конечно, и это то, что возвращается. Но для того, чтобы условие работало, a > b совершенно очевидно, что должно быть a bool .

Ответ №7:

operator > должен возвращать bool, а не MyClass amp; так:

 bool MyClass::operator>(MyClass amp;rhs)
{
    return m_iSize > rhs.m_iSize;
}
  

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

1. Извините… в этой теме так много сообщений, что я случайно отредактировал неправильный пост.

2. Спасибо всем за ваши сообщения!! Я точно понимаю, что вы имеете в виду, у меня был момент безумия. Я запутался во всех Ts и тому подобном… Кроме того, я скопировал большую часть синтаксиса из оператора присваивания, который, естественно, возвращает ссылку. 🙂

Ответ №8:

Попробуйте это

 bool MyClass::operator>(MyClass amp;rhs)
{
    return m_iSize > rhs.m_iSize ;
}
  

Ответ №9:

operator> For MyClass должен просто определять, является ли один экземпляр класса больше другого, и он должен возвращать type bool , а не type MyClassamp; . Измените его так, чтобы он выглядел следующим образом:

 bool MyClass::operator>(const MyClass amp;rhs) const
{
    return m_iSize > rhs.m_iSize; 
}
  

Теперь это позволит правильно проверить, является ли текущий экземпляр MyClass больше MyClass экземпляра в правой части > оператора в таком выражении.