gpt4 book ai didi

C++ 类模板构造函数——用数组 (U*) 重载引用 (U&) 失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:38 25 4
gpt4 key购买 nike

我正在尝试构建一个构造函数以将数组作为参数,该参数会重载另一个采用标量的参数。代码如下。

#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>并替换 UT .该程序运行良好。我应该怎么做才能纠正这个问题?

如有任何建议,我们将不胜感激!

最佳答案

以下是如何使用 SFINAE 获得您想要的内容:

#include <vector>
#include <map>
#include <string>

using namespace std;

template<class T>
struct Foo {

template <class U, typename enable_if<is_pointer<U>::value, int>::type = 0>
Foo(U u){}

template <class U, typename enable_if<!is_pointer<U>::value, int>::type = 0>
Foo(U u){}

};


int main()
{
Foo<int> f('a'); // calls second constructor
Foo<int> f2("a"); // calls first constructor
}

直播:https://godbolt.org/g/ZPcb5T

关于C++ 类模板构造函数——用数组 (U*) 重载引用 (U&) 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36820329/

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