gpt4 book ai didi

c++ - 在另一个数组中使用固定大小的数组初始化列表

转载 作者:行者123 更新时间:2023-11-28 05:14:14 28 4
gpt4 key购买 nike

我尝试执行以下操作:

template <typename T, int N>
struct Vector {
T v[N];
template<typename... Args> Vector(Args... args) : v { args... } {}
template<typename S> Vector(Vector<S, N> const & V) : v {V.v} {}
};
int main() {
Vector<float, 4> V (1.0f, 2.0f, 3.0f, 4.0f);
Vector<float, 4> V2 (V);
for (auto f : V2.v) { cout << f << ", "; } cout << endl;
return 0;
}

而且它起作用了(打印出“1, 2, 3, 4,”),所以我没有怀疑任何事情,直到我尝试用 :

  Vector(Vector const & V) : v {V.v} {}

或将其用于:

  Vector<double, 4> V2 (V);

编译器说:

error: cannot convert 'const float*' to 'float' in initialization

或与'double'相同。

在那之后我尝试了简单的数组,但由于同样的错误而失败了,但是有了足够的模板它就可以工作了..

有人可以向我解释一下这是怎么回事吗?

最佳答案

你不能用另一个数组来初始化一个数组。

不,它也不适用于模板复制构造函数,下面的代码片段给出了相同的错误消息。

template <class T, int N>
struct Vector2 {
T vv[N];
};

template <typename T, int N>
struct Vector {
T v[N];
template<typename T1>
Vector(const Vector2<T1, N> & V) : v{V.vv} {}
};

int main() {
Vector2<float, 4> V2;
Vector<float, 4> V1(V2);

return 0;
}

您的代码片段之所以有效,是因为编译器使用了隐式声明的复制构造函数。如果你显式声明它为 deleted 或 private 成员,你会发现编译器甚至不尝试实例化模板复制构造函数,我不知道为什么。

我发现 V.v总是衰减为指针,即使我尝试将其转换为 T (&)[N]与重新解释。 *reinterpret_cast<T (*)[N]>(V.v)

所以...我试图找到答案,但它只会导致更多问题...


解决方法是将数组包装到一个类中。

关于c++ - 在另一个数组中使用固定大小的数组初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42982206/

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