【发布时间】:2021-01-27 13:51:26
【问题描述】:
我正在尝试实现一个通用模板类。我希望使用 3 个整数 {0,0,0} 的 std::array 实例化该类的默认元素,但是,我不知道如何放置默认参数列表。 我的目标:
Vec<> a; -> 创建一个带有数组 {0,0,0} 作为私有成员的 vec3
Vec<int,3> b; -> 同上
Vec<int,2> c; -> 创建一个带有数组 {0,0} 的 vec
Vec<double,3> d(4,5,9); -> 创建一个以 {4,5,9} 作为双精度的 vec
我的代码, vec.h
template<typename T = int, int N = 3>
class Vec{
public:
Vec(T v0,T v1) : vec_coordinates_ ({v0,v1} = {0,0}){
static_assert(N == 2, "wrong number of arguments");
};
Vec(T v0,T v1,T v2) : vec_coordinates_ ({v0,v1,v2}){
static_assert(N == 3, "wrong number of arguments");
};
private:
std::array<T,N> vec_coordinates_;
}
不编译。 具有两个元素的数组的构造函数有效。
Vec(T v0,T v1) : vec_coordinates_ ({v0,v1} = {0,0}) {
static_assert(N == 2, "wrong number of arguments");};
上面的编译,但是
Vec3(T v0,T v1,T v2) : vec_coordinates_ ({v0,v1,v2} = {0,0,0}) { //C2059
static_assert(N == 3, "wrong number of arguments");
};
不编译。我得到了错误:
错误 C2059:语法错误:'='
与 {0,0,0} 一致。
我不明白其中的区别,为什么 {0,0} 可以编译而带有 3 个零的数组却没有。如果您有任何提示或建议,我将不胜感激。
【问题讨论】:
-
({v0,v1} = {0,0})应该做什么? -
应该保证 Vec
b;将导致 a 对象 b 具有 vec_coordinates_ 的私有 std::array 等于 {0,0}