我尝试执行以下操作:
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;
}
它有效(印刷&#34; 1,2,3,4和#34;),所以我没有怀疑任何事情,直到我试图&#34;专门化它&#34;用:
Vector(Vector const & V) : v {V.v} {}
或与之一起使用:
Vector<double, 4> V2 (V);
编译说:
错误:无法转换&#39; const float *&#39;到&#39;漂浮&#39;在初始化
或与&#39; double&#39;相同。
之后我尝试了简单的数组,它失败了同样的错误,但是有足够的模板可以工作..
有人可以向我解释这里发生了什么吗?
答案 0 :(得分:1)
您无法使用其他阵列初始化数组。
不,它也不能使用模板拷贝构造函数,以下代码片段只是给出了相同的错误消息。
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;
}
您的代码段工作原因是因为编译器使用了隐式声明的复制构造函数。如果你明确地将它声明为已删除或私有成员,你会发现编译器甚至没有尝试实例化模板复制构造函数,我不知道为什么。
我发现V.v
总是衰减到指针,即使我尝试使用reinterpret_cast将其强制转换为T (&)[N]
。 *reinterpret_cast<T (*)[N]>(V.v)
所以......我试着找出答案,但这只会导致更多问题......
解决方法可以将数组包装到类中。