【发布时间】:2016-08-17 15:34:46
【问题描述】:
我正在尝试构建一个构造函数来将数组作为参数,该参数会重载另一个使用标量的数组。代码如下。
#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。该程序运行良好。我应该怎么做才能纠正这个问题?
欢迎提出任何建议!
【问题讨论】:
-
提示:第一个构造函数被调用两次。
-
@LogicStuff 非常感谢您的及时评论。是的,第一个构造函数被再次调用。这可能意味着数组(或指向数组的指针)是通过引用传递的?但是我应该如何告诉程序找到第二个构造函数,或者我应该如何区分第一个方法中的参数是标量还是数组?请您再给我一些提示好吗?
-
您必须使用SFINAE 或标签调度。
-
@LogicStuff 或使用
explicit SmallVec(U* vec)而不是explicit SmallVec(const U* vec)。或者使用SmallVec<float> vec2(static_cast<const float *>(arr));而不是SmallVec<float> vec2(arr);。 -
@LogicStuff 这很有帮助!非常感谢您告诉我这些要查找的主题! :-)
标签: c++ arrays templates constructor constructor-overloading