我正在尝试构建一个构造函数,以将数组作为参数,从而使另一个使用标量的参数过载。代码如下。
#include <iostream>
template <typename T>
class SmallVec { // This is a 3 dimensional vector class template
public:
T data[3] = {0}; // internal data of class
template <typename U>
explicit SmallVec(const U& scalar) { // if a scalar, copy it to each element in data
for(auto &item : data) {
item = static_cast<T>(scalar);
}
}
template <typename U>
explicit SmallVec(const U* vec) { // if a vector, copy one by one
for(auto &item : data) {
item = static_cast<T>(*vec);
vec++;
}
}
};
int main() {
float num = 1.2;
float *arr = new float[3];
arr[2] = 3.4;
SmallVec<float> vec1(num); // take num, which works fine
SmallVec<float> vec2(arr); // !!!--- error happens this line ---!!!
std::cout << vec1.data[2] << " " << vec2.data[2] << std::endl;
return 0;
}
编译器抱怨
error: invalid static_cast from type 'float* const' to type 'float'
显然,vec2(arr)
仍然调用第一个构造函数。但是,如果我删除template <typename U>
并替换U
为T
。该程序运行正常。我该怎么做才能纠正这个问题?
任何建议表示赞赏!
我正在尝试构建一个构造函数以将数组作为参数
(...)
explicit SmallVec(const U* vec) { // if a vector, copy one by one
您不采用数组。您使用了一个指针,该指针可能指向也可能不指向数组,即使它指向一个数组,谁会说该数组至少包含三个元素?这是一个严重的设计缺陷。
C ++确实允许您通过引用或const引用获取原始数组,即使语法很糟糕:
explicit SmallVec(const U (&vec)[3]) {
构造函数的实现也不同:
for(int index = 0; index < 3; ++index) {
data[index] = static_cast<T>(vec[index]);
}
看着main
,不过,问题更大。您用于new[]
动态分配数组。那已经是一个非常糟糕的主意了。巧合的是,您的示例也缺少delete[]
。为什么不使用局部数组呢?
float arr[3];
这将使您的程序编译并可能正确运行,但是由于您仅将数组的第3个元素设置为有效值,因此代码中仍然存在未定义的行为。其他两个元素保持未初始化状态,并且float
即使未复制就从未初始化的读取,也会导致未定义的行为。
所以最好做到:
float arr[3] = { 0.0, 0.0, 3.4 };
除此之外,C ++ 11还邀请您使用std::array
,这通常会使事情更安全,并改善了语法。这是一个完整的示例:
#include <iostream>
#include <array>
template <typename T>
class SmallVec { // This is a 3 dimensional vector class template
public:
std::array<T, 3> data; // internal data of class
template <typename U>
explicit SmallVec(const U& scalar) { // if a scalar, copy it to each element in data
for(auto &item : data) {
item = static_cast<T>(scalar);
}
}
template <typename U>
explicit SmallVec(std::array<U, 3> const& vec) { // if a vector, copy one by one
for(int index = 0; index < 3; ++index) {
data[index] = static_cast<T>(vec[index]);
}
}
};
int main() {
float num = 1.2;
std::array<float, 3> arr = { 0.0, 0.0, 3.4 };
SmallVec<float> vec1(num);
SmallVec<float> vec2(arr);
std::cout << vec1.data[2] << " " << vec2.data[2] << std::endl;
return 0;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句