#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)
| ~~~~~~~^~~
如何修改此代码,以便我可以比较任意两种类型的向量
您的
operator==
希望两个 vec
具有相同类型 T
。
这确实有道理。
在这一行中:
if (vec1 == vec2) {
您正在尝试将
vec<std::string>
与 vec<int>
进行比较。
编译器发出错误,因为它不符合您的 operator==
声明。
即使您确实为这种情况实现了
operator==
,我也看不出有什么意义。
唯一可以认为它们相等的情况是它们都为空,这是您可以轻松测试的东西,而无需混淆 operator==
的语义。