gpt4 book ai didi

c++ - 非模板代码有效时,模板代码无效!

转载 作者:太空狗 更新时间:2023-10-29 20:00:31 25 4
gpt4 key购买 nike

我花了好几个小时,当我意识到只有我的代码的模板版本有错误时,我完全陷入了困境。

在下面的代码中,当 push_back 元素在 myMap 时, 原始 vector myVec1myVec2在执行结束时被修改并包含垃圾。如果我取消模板化所有内容,只需替换 template<T>乘以 double,然后代码可以正常工作(原始数组未受影响)。

有趣的是,如果我把 coutcopy constructor ,如果代码是模板化的,它不会被调用。但是如果我用 Vector<T2> 替换复制构造函数,它就会被调用。按原始类型Vector<T> ,然后一切正常。

为什么编译器不知道 T2==T因为我只使用 double

(请注意,代码已尽可能短,以便显示错误 - 因此我删除了访问器,将所有内容公开等)。

#include <vector>
#include <map>


template<class T>
class Vector{
public:
Vector():n(0),data(0){};
Vector(int N):n(N),data(new T[N]){};
Vector(T x, T y):n(2),data(new T[2]){data[0]=x; data[1]=y;};
template<class T2> Vector(const Vector<T2>& rhs):n(rhs.n), data(new T[n])
{
for (int i=0; i<n; i++)
data[i] = T(rhs.data[i]);
}
~Vector(){delete[] data;}

Vector& operator=(const Vector& rhs)
{
if (rhs.n != n)
{
if (data)
delete[] data;
data = new T[rhs.n];
}
n = rhs.n;
memcpy(data, rhs.data, n*sizeof(T));
return *this;
}
T& operator[](int i){return data[i];}
const T& operator[](int i) const {return data[i];}
int n;
T* data;
};

typedef Vector<double> Vectord;

template <class T> inline bool operator<(const Vector<T>& v1, const Vector<T>& v2)
{
for (int i=0; i<v1.n; i++)
{
if (v1[i]<v2[i]) return true;
if (v1[i]>v2[i]) return false;
}
return false;
}


int main(int argc, char** argv)
{
std::vector<Vectord> myVec1(3);
myVec1[0] = Vectord(1.,3.);
myVec1[1] = Vectord(3.,3.);
myVec1[2] = Vectord(1.,5.);

std::vector<Vectord> myVec2(3);
myVec2[0] = Vectord(4.,1.);
myVec2[1] = Vectord(2.,5.);
myVec2[2] = Vectord(6.,5.);

std::map<Vectord, std::vector<Vectord> > myMap;
for (int i=0; i<3; i++)
{
myMap[myVec1[i]].push_back(myVec2[i]);
}



return 0;
}

最佳答案

模板构造函数永远不是复制构造函数。

因此您的类正在使用自动生成的复制构造函数。

干杯,

关于c++ - 非模板代码有效时,模板代码无效!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6510654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com