我正在使用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&lt;,_ V0_t,_V1_t,_V2_t,_V3_t,_V4_t&gt;转换*'to'std :: tuple&lt;,_ V0_t,_V1_t,_V2_t,_V3_t&gt; &安培;&安培;”存在,但无法访问。
在寻找解决方案时,它似乎暗示它与访问保护有关,但我不认为这将是解决方案的途径。
我得到的intellisense错误是没有std :: get的实例与参数列表匹配。
答案 0 :(得分:4)
在VS 2013之前,Visual Studio并不真正支持可变参数模板,这意味着他们使用宏生成的“重载”来支持通常使用此语言功能实现的C ++ 11 STL功能。默认情况下,这些重载最多支持五个(模板)参数。但是,以更高的编译时间为代价,可以使用_VARIADIC_MAX
define。
您可以在5到10之间定义
_VARIADIC_MAX
项目范围(默认为5)。
有关详细信息,请参阅C++11 Features in Visual C++ 11 VCBlog条目中的“虚假变量”部分。
答案 1 :(得分:0)
Visual Studio没有完全支持C ++ 11,因此它使用有限数量的模板参数(在本例中为5)作为缺少可变参数模板支持的补偿。我的假设是任何大于5的模板参数都不会编译。