我已经为模板类编写了默认的构造方法,该方法将此处的所有值都标记为0。我唯一的想法是检查typename T
是否为字符串类型,然后像对待字符串一样使用它。
vec(const size_t size_ = 0): _size(size_), values(_size? new T[_size]:0){
for(size_t i = 0; i < _size; i++)
values[i] = 0;
}
在main中,我是这样使用的:
vec<int> t1; // default constructor works perfectly
vec<string> s2; // ambiguous overload here (signing string to int)
但是我得到以下错误:
错误:'operator ='的模棱两可的重载(操作数类型为'std :: __ cxx11 :: basic_string'和'int')
编辑:类头看起来像这样:
...
template<typename T>class vec{
private:
size_t _size;
T * values;
public:
vec(const size_t size_ = 0): _size(size_), values(_size? new T[_size]:0){
for(size_t i = 0; i < _size; i++)
values[i] = 0;
}
...
您不需要知道类型,只需要使用更好的初始化程序即可。不要使用0
,而要使用T{}
或{}
,例如
vec(const size_t size_ = 0): _size(size_), values(_size? new T[_size]:0){
for(size_t i = 0; i < _size; i++)
values[i] = T{}; // or values[i] = {};
}
现在您会获得value initialized T
的任何类型T
。
您可以使代码更短并且只需使用
vec(const size_t size_ = 0): _size(size_), values(_size? new T[_size]{} : 0) {}
[T[_size]{}
将为您初始化整个数组的值。