Myk*_*hyn 3 c++ templates initialization g++ class
我已经为模板类编写了以下默认构造函数,它将这里的所有值都标记为 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;
}
Run Code Online (Sandbox Code Playgroud)
在 中main,我是这样使用的:
vec<int> t1; // default constructor works perfectly
vec<string> s2; // ambiguous overload here (signing string to int)
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
错误:“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;
}
...
Run Code Online (Sandbox Code Playgroud)
你不需要知道类型,你只需要使用更好的初始化程序。而不是 using 0, useT{}或{}代替 like
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] = {};
}
Run Code Online (Sandbox Code Playgroud)
您可以使代码更短,只需使用
vec(const size_t size_ = 0): _size(size_), values(_size? new T[_size]{} : 0) {}
Run Code Online (Sandbox Code Playgroud)
并将T[_size]{}为您值初始化整个数组。
此外, while0是一个合适的空指针值,您应该使用它nullptr。这更明确地传达了您正在请求一个空指针,并且如果由于某种原因您的类型变为没有指针,它也可以节省您,因为它会导致编译器错误。