重载类模板运算符==,以便在不同的数据类型对象上定义C++

qzwqbdag  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(102)

我必须编写一个类模板arrayPlus,其中对象是类型T的数组。
运算符==必须重载,这样类的两个对象在它们属于相同类型时相等,否则返回false。
我已经重载了它,但是它似乎只在相同类型的数据上定义。我如何定义它,使它在不同数据类型的数组上工作?
下面是类模板的代码(包括运算符重载)

#include <typeinfo>

using namespace std;

template<class T> class arrayPlus {
    T* type;
    int nbElem;

public:
    arrayPlus(int n) {
        nbElem = n;
        type = new T[nbElem];
    };

    bool operator == (arrayPlus& const obj) {
        return (typeid(this->type) != typeid(obj.type));
    }
};

而且,总的来说,这段代码必须编译并返回false

int main(){
   #include <iostream>
#include <typeinfo>

#include "arrayPlus.h"

using namespace std;

int main() {
    arrayPlus<bool> arrBool(3);
    arrayPlus<int> arrInt(3);
    arrBool == arrInt;//<-- error
}

在==语句处出错

no operator "==" match these operands 
    operand types are: arrayPlus<bool> == arrayPlus<int>
0yycz8jy

0yycz8jy1#

正如在评论中提到的,你应该注意到tableauPlus<bool>tableauPlus<int>是两个不同的类型。而且你的operator==只能比较tableauPlus<T>tableauPlus<T>
请注意,当你在tebleauPlus<T>的定义中写入tablaeuPlus时,它实际上是指tableauPlus<T>。这只是一种简化的方法。你的bool operator == (tableauPlus const&);实际上是bool operator == (tableauPlus<T> const&);
您希望模板化的operator==能够将tableauPlus<T>tableuPlus<U>进行比较。
作为非成员:

#include <iostream>
#include <type_traits>

template<typename T>
struct foo {
    int value = 42;
};

template <typename T,typename U>
bool operator==(const foo<T>& a,const foo<U>& b) {
    if constexpr (!std::is_same_v<T,U>) return false;
    return a.value == b.value;
}

int main() {
    foo<int> a;
    foo<bool> b;

    std::cout << (a==b);
    std::cout << (a==a); 
}
wqsoz72f

wqsoz72f2#

对于injected class name,您只能定义两个操作数类型相同的operator ==

template <class T>
class tableauPlus {
public:
    
    bool operator == (tableauPlus const&); // tableauPlus<T>
};

你需要额外的负荷:

template <typename T, typename U>
bool operator == (tableauPlus<T> const&, tableauPlus<U> const&){ return false; }

你现有的超负荷

/*OPERATOR OVERLOAD*/
template<class T> 
inline bool tableauPlus<T>::operator==(tableauPlus<T> const& obj) {
    return this->firstIndex == obj.firstIndex && this->lastIndex == obj.lastIndex;
}

相关问题