【发布时间】:2016-03-03 05:20:05
【问题描述】:
考虑以下代码:
#include <cstddef> //for std::size_t
template<class T, std::size_t Size>
class Array
{
private:
T _data[Size];
public:
template<class... Args>
Array(Args&&... vals)
: _data{ vals... }
{}
};
int main()
{
Array<int, 3> a = { 1, 2, 3 };
Array<int, 3> b = { 4, 5, 6 };
Array<Array<int, 3>, 2> arr = { a, b };
}
类的前两个对象(a 和 b)一切正常。
然后我声明一个数组数组(如果你愿意,可以是二维数组)。所以当Array<Array<int, 3>, 2> arr;的构造函数被执行时,我相信模板参数T将等于Array<int, 3>。这样我们应该能够成功地给Args&&... 其他相同类型的对象。然后参数包会展开。
所以Array<Array<int, 3>, 2> arr; 本质上应该有一个私有成员:
Array<int, 3> _data[2];
显然不是,因为我得到了标题中的错误。
【问题讨论】:
-
在发布之前测试您的代码。
-
@Karoly Horvath 我测试了我的代码,但对它没有按我预期的那样工作感到困惑。这就是我发布问题的原因。我在实际问题中尽可能地解释了我的困惑。
-
不,测试你实际发布的代码。
-
@Karoly Horvath 好的,这是一个错字。我的错。
-
@VillasV
class = std::enable_if_t<sizeof...(Args) <= Size>从示例中省略。做这项工作。
标签: c++ arrays templates c++11 variadic-templates