我在C ++中重载比较运算符时遇到了很多麻烦。我不认为我做得对,任何帮助表示赞赏。我在下面提供了我班级的片段。
template <typename T>
class A
{
public:
template <typename T>
bool operator< (const A<T>& rhs) const {
return (value < rhs);
}
private:
T value;
};
答案 0 :(得分:1)
如果您希望使用相同类型A
对两个T
对象进行参数化,请删除运算符上的内部template <typename T>
。
否则,如果您希望运营商使用与A
不同的类型参数T
,请将内部template <typename T>
更改为template <typename U>
,然后更改{{1}转到rhs
。
答案 1 :(得分:1)
如果order_subtotal = order.items.map{|item| item.price * item.quantity}.reduce(:+)
接受operator<
对象,其模板参数为不同类型,然后与要比较的A
对象,则必须使用不同的模板参数名称:
A
只要template <typename T>
class A
{
public:
template <typename Other>
bool operator< (const A<Other>& rhs) const {
return (value < rhs.value);
}
private:
T value;
};
和T
类型与Other
相当,就可以使用此功能。
但是,如果您要比较具有相同模板类型的两个<
对象,则A
根本不需要拥有自己的模板:
operator<
答案 2 :(得分:0)
如果您想支持简单的用例,例如:
A<int> a = { some_value };
A<int> b = { some_other_value } ;
if ( a < b ) { ... }
operator<
函数不需要是成员函数模板。您可以将代码简化为:
template <typename T>
class A
{
public:
bool operator<(const A& rhs) const {
return (value < rhs.value);
}
private:
T value;
};
如果您希望能够使用:
A<int> a = { some_value };
A<float> b = { some_other_value } ;
if ( a < b ) { ... }
然后operator<
函数需要是成员函数模板。但是,请确保两个模板参数名称不同。您可以使用:
template <typename T>
class A
{
public:
template <typename T1>
bool operator<(const A<T1>& rhs) const {
return (value < rhs.value);
}
private:
T value;
};
只要T
和T1
支持此类操作,这将有效。
答案 3 :(得分:0)
我不确定您是否需要两个不同的模板参数或一个。这是只有一个typename的解决方案(我还添加了getter for value,因为我更喜欢)。您不需要在模板内部定义,您需要比较实例的值,而不仅仅是值和实例A.
template <typename T>
class A {
public:
bool operator < (const A<T> & rhs) const {
return (value < rhs.getValue());
}
const T & getValue() const{
return this -> value;
}
private:
T value;
};
如果你想要两个模板参数,那就更复杂了。除非你只有几个类需要像这样工作,你可以做&lt;每个人的操作员。否则它可能会变得混乱,我相信你会想要做更好的解决方案。