2011-10-05 57 views
1

我正在玩弄模板,并尝试了以下方法,但是'无法将'MyClass'转换为'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; 
} 
+0

问得好除了冠军。你显示错误信息和所有相关的代码!甚至有一个问号! –

+0

@Joe:你有答案吗?它是哪一个? –

回答

6

>运营商应该返回bool,而不是一个MyClass参考。

+0

运算符>太... – sehe

1

>运营商需要返回bool(或一些可以自动转换为bool,如int),而不是一个MyClass&

3

您的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; 
} 
+0

当你正在纠正'operator>'时,注意它应该是一个'const'函数。 –

+0

@MooingDuck完成。 –

0

operator>MyClass应该简单地定义类的一个实例是否比其他的大,它应该返回类型bool,不会打字MyClass&。修改它,使它看起来像下面这样:

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

现在,这将正确测试的MyClass当前实例是否比。在这种表达中的>操作的右手侧MyClass实例较大。

2

语法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 
} 
1

您需要从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

1

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

+0

但是,这不是模板的力量,例如..T结果; 结果=(a> b)? a:b; 结果是类型T这是MyClass,为什么我不能返回? – Yos

+0

一般来说,是的,方法的返回类型可以是模板参数。但考虑“大于”的语义...任何其他结果类型比布尔将是奇怪的。 – Dabbler

+1

@JoeSaddigh:在百万算符'(a> b)? a:b;'(a> b)'的结果应该是'bool'而不是'MyClass',因此你的'>'运算符应该返回一个'bool'。 –

1

operator >应该返回布尔而不是MyClass &这样的:

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

对不起......有这么多帖子进入这个帖子,我偶然编辑错误的帖子。 – Jason

+0

谢谢大家的留言!我明白你的意思是我有一段时间疯狂。我对所有的Ts和东西感到困惑......另外,我复制了赋值运算符的大部分语法,该运算符自然返回一个ref。 :-) – Yos

1

尽管试试这个

bool MyClass::operator>(MyClass &rhs) 
{ 
    return m_iSize > rhs.m_iSize ; 
} 
相关问题