我最近将一个C ++代码从VS2012迁移到了VS2013。代码在VS2012下编译,但VS2013抛出了C1001内部编译器错误。
具体来说,错误指向std库中的tuple.h文件:
template<class... _Types1,
class _Kx_arg,
size_t... _Ix,
size_t _Ix_next,
class... _Types2,
class... _Rest>
struct _Tuple_cat2<tuple<_Types1...>, _Kx_arg, _Arg_idx<_Ix...>, _Ix_next,
tuple<_Types2...>, _Rest...>
: _Tuple_cat2<
tuple<_Types1..., _Types2...>,
typename _Cat_arg_idx<_Kx_arg,
typename _Make_arg_idx<_Types2...>::type>::type,
_Arg_idx<_Ix..., _Repeat_for<_Ix_next, _Types2>::value...>,
_Ix_next + 1,
_Rest...>
{ // determine tuple_cat's return type and _Kx/_Ix indices
};
我的代码调用std :: tuple_cat方法以检索连接元组的类型(注意具有void类型的部分特化):
template <typename TupleA, typename TupleB>
struct tuple_concatenator//yields the type of two concatenated tuples.
{
typedef decltype(std::tuple_cat(std::declval<TupleA>(),
std::declval<TupleB>())) type;
};
template <typename TupleA>
struct tuple_concatenator<TupleA, void>//yields the type of TupleA.
{
typedef TupleA type;
};
template <typename TupleB>
struct tuple_concatenator<void, TupleB>//yields the type of TupleB.
{
typedef TupleB type;
};
template <>
struct tuple_concatenator<void, void>
{
typedef void type;
};
如何配置VS2013或重写上述代码以避免C1001错误?
提前感谢您的帮助。
答案 0 :(得分:1)
ICE始终是编译器错误。向Microsoft提交一个错误(另外,请尝试查看是否可以在运行VS2015 RC的http://webcompiler.cloudapp.net/上重现它。)
std::tuple_cat
实现起来很棘手,因为它需要能够有效地连接任意数量的元组 - 包括类型和值。但是,如果您只需要连接两个std::tuple<...>
类型,则不需要复杂的tuple_cat
机制;它很简单:
template <typename TupleA, typename TupleB>
struct tuple_concatenator;
template <class... Ts, class... Us>
struct tuple_concatenator<std::tuple<Ts...>, std::tuple<Us...>>
{
typedef std::tuple<Ts..., Us...> type;
};
对于void
的现有部分和完整专业化,这应该可以正常使用。