#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)
ожидается, что результатом будет anbool
, а неMyClass
, и, следовательно, ваш>
оператор должен возвращать abool
.4. @Joe:
a
иb
MyClass
, конечно, и это то, что возвращается. Но для того, чтобы условие работало,a > b
совершенно очевидно, что должно быть abool
.
Ответ №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
экземпляра в правой части >
оператора в таком выражении.