模板编程中的"Cannot convert 'MyClass' to 'bool'"错误



我正在玩模板,并尝试了以下,但得到'不能转换'MyClass'到'bool'错误?

#include "Unit2.h"
using namespace std;
template <class T>
T GetMax (T a, T b) {
  T result;
  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定义了一个>操作符,如下所示:
MyClass& MyClass::operator>(MyClass &rhs)
{
    MyClass& rkReturn = ( m_iSize > rhs.m_iSize ) ? *this : rhs;
    return rkReturn; 
}

您的>操作符应该返回bool,而不是MyClass引用。

您的operator>返回MyClass&而不是bool。通过在条件运算符中使用它,编译器试图将返回的MyClass强制转换为bool

改变
MyClass& MyClass::operator>(MyClass &rhs)
{
    MyClass& rkReturn = ( m_iSize > rhs.m_iSize ) ? *this : rhs;
    return rkReturn; 
}

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

语法x ? y : z要求x可转换为bool类型。给它一个表达式(a > b),它调用运算符MyClass& MyClass::operator>(MyClass &rhs),通过引用返回一个MyClass。编译器无法将此引用转换为bool,并且感到困惑。MyClass::operator>(MyClass &rhs)应该返回一个bool

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

您的>运算符需要返回bool(或可以自动转换为bool的内容,例如int),而不是MyClass&

您需要从operator>返回bool

那么试试这个:

bool MyClass::operator>(const MyClass &rhs)
{
    return m_iSize > rhs.m_iSize;
}
如果将关键字放在函数的右侧,使其成为const函数会更好,如下所示:
bool MyClass::operator>(const MyClass &rhs) const 
{                                        // ^^^^^ this makes the function const
    return m_iSize > rhs.m_iSize;
}

const也放在声明上

operator>应该声明/定义为返回bool值,而不是MyClass&

operator >应该像这样返回bool值而不是MyClass &:

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

试试这个

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

MyClassoperator>应该简单地定义类的一个实例是否大于另一个,并且它应该返回类型bool,而不是类型MyClass&。修改它,使其看起来像这样:

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

这将正确地测试当前MyClass实例是否大于>操作符右侧的MyClass实例。

最新更新