我正在尝试编写模板化代码来比较两个向量,但我收到这些错误

问题描述 投票:0回答:1
#include <iostream>
#include <string>

#define BLOCK_SIZE 5

template<typename T>
class vec {
 T*ptr;
    int size;
    int capacity;
    public:
    
    vec():size(0),capacity(BLOCK_SIZE)
    {
        ptr = new T[capacity];
    }
    vec(int size1)
    {
        capacity=size1;
        ptr = new T[capacity];
        
    }
    void push_back(T val)
    {
        if(size==capacity)
        {
            T*ptr1 = new T[capacity];
            for(int i=0;i<size;i++)
            {
                ptr1[i]=std::move(ptr[i]);
            }
            delete[] ptr;
            ptr = nullptr;
            capacity+=BLOCK_SIZE;
            ptr = new T[capacity];
            for(int i=0;i<size;i++)
            {
                ptr[i]=std::move(ptr1[i]);
            }
            delete[] ptr1;
            ptr1= nullptr;
        }
        ptr[size++]=val;
    }
    
    T& operator[] (int num)
    {
        return ptr[num];
    }
    bool operator == (vec<T> obj)
    {
    if (this->size != obj.size) {
        return false; // Different sizes, not equal
    }
    else
    return true;
    }
    template<typename U>
    friend bool operator==(const vec<U>& lhs, const vec<U>& rhs);
};

template<typename T>
bool operator==(const vec<T>& lhs, const vec<T>& rhs) {
    if (lhs.size != rhs.size) {
        return false;
    }

    for (int i = 0; i < lhs.size; ++i) {
        if (lhs.ptr[i] != rhs.ptr[i]) {
            return false;
        }
    }

    return true;
}

int main() {
    vec<std::string> vec1;
    vec<int> vec2(10);
    vec2.push_back(100);
    vec1.push_back("abhinav");

    std::cout << vec1[0] << std::endl;
    std::cout << vec2[0] << std::endl;

    if (vec1 == vec2) {
        std::cout << "Same vectors" << std::endl;
    } else {
        std::cout << "Different vectors" << std::endl;
    }

    return 0;
}

下面是我在 gcc 编译器中遇到的错误

main.cpp: In function ‘int main()’:
main.cpp:86:14: error: no match for ‘operator==’ (operand types are ‘vec >’ and ‘vec’)
   86 |     if (vec1 == vec2) {
      |         ~~~~ ^~ ~~~~
      |         |       |
      |         |       vec<int>
      |         vec<std::__cxx11::basic_string<char>>
main.cpp:50:10: note: candidate: ‘bool vec::operator==(vec) [with T = int]’ (reversed)
   50 |     bool operator == (vec<T> obj)
      |          ^~~~~~~~
main.cpp:50:30: note:   no known conversion for argument 1 from ‘vec>’ to ‘vec’
   50 |     bool operator == (vec<T> obj)
      |                       ~~~~~~~^~~

如何修改此代码,以便我可以比较任意两种类型的向量

c++ templates vector
1个回答
0
投票

您的

operator==
希望两个
vec
具有相同类型
T

这确实有道理。

在这一行中:

if (vec1 == vec2) {

您正在尝试将

vec<std::string>
vec<int>
进行比较。 编译器发出错误,因为它不符合您的
operator==
声明。

即使您确实为这种情况实现了

operator==
,我也看不出有什么意义。 唯一可以认为它们相等的情况是它们都为空,这是您可以轻松测试的东西,而无需混淆
operator==
的语义。

© www.soinside.com 2019 - 2024. All rights reserved.