3

我在一个元组上使用 std::get 。当给定一个 5 个整数的元组时,它可以正常工作:

typedef std::tuple<int, int, int, int, int> int5Tuple;

std::get<1>(int5Tuple(1, 2, 3, 4, 5));

然而,在 6 个整数的元组上,它失败了:

typedef std::tuple<int, int, int, int, int, int> int6Tuple;

std::get<1>(int6Tuple(1, 2, 3, 4, 5, 6));

给出此错误:错误 C2243: 'type cast' : 从 'std::tuple<,_V0_t,_V1_t,_V2_t,_V3_t,_V4_t> *' 转换为 'std::tuple<,_V0_t,_V1_t,_V2_t,_V3_t> && ' 存在,但无法访问。

在寻找解决方案时,似乎暗示它与访问保护有关,但我不认为这将是解决方案的途径。

我得到的智能感知错误是没有 std::get 的实例与参数列表匹配。

4

2 回答 2

4

直到 VS 2013,Visual Studio 才真正支持可变参数模板,这意味着它们改为使用宏生成的“重载”来支持通常使用此语言功能实现的 C++11 STL 功能。默认情况下,这些重载最多支持五个(模板)参数。但是,以更高的编译时间为代价,这可以使用_VARIADIC_MAX定义进行配置。

_VARIADIC_MAX您可以在 5 到 10 之间定义项目范围(默认为 5)。

有关更多详细信息,请参阅Visual C++ 11 VCBlog 条目中的 C++11 功能中的“Faux variadics”部分。

于 2013-09-21T15:34:43.337 回答
0

Visual Studio doesn't have full support of C++11 so it uses a limited amount of template arguments (5 in this case) as compensation for a lack of variadic template support. My assumption is that any template arguments greater than 5 won't compile.

于 2013-09-21T15:16:45.340 回答