VS2013 C++;C1001 std::tuple\u cat错误 我最近将一个C++代码从VS2012迁移到VS2013。代码是在VS2012下编译的,但VS2013抛出C1001内部编译器错误

VS2013 C++;C1001 std::tuple\u cat错误 我最近将一个C++代码从VS2012迁移到VS2013。代码是在VS2012下编译的,但VS2013抛出C1001内部编译器错误,c++,visual-studio-2012,visual-studio-2013,stdtuple,C++,Visual Studio 2012,Visual Studio 2013,Stdtuple,具体而言,错误指向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_ne

具体而言,错误指向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
    };
模板
结构元组cat2
:_Tuple_cat2<
元组,
typename _Cat_arg_idx::type,
_Arg_idx,
_Ix_下一步+1,
_休息…>
{//确定tuple_cat的返回类型和_Kx/_Ix索引
};
我的代码调用std::tuple_cat方法以检索连接元组的类型(注意void类型的部分专门化):

模板
struct tupleu concatenator//生成两个连接元组的类型。
{
typedef decltype(std::tuple_cat(std::declval(),
std::declval())类型;
};
模板
struct tuple\u concatenator//生成TupleA的类型。
{
typedef树型;
};
模板
struct tuple\u concatenator//生成元组的类型。
{
typedef元组类型;
};
模板
结构元组连接器
{
typedef-void型;
};
如何配置VS2013或重写上述代码以避免C1001错误


提前感谢您的帮助。

ICE总是一个编译器错误。向Microsoft提交一个bug(同时,尝试看看是否可以在运行VS2015 RC的系统上复制它)

std::tuple\u cat
很难实现,因为它需要能够有效地连接任意数量的元组(类型和值)。但是如果只需要连接两个
std::tuple
类型,就不需要复杂的
tuple\u 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;
};
模板
结构元组连接器;
模板
结构元组连接器
{
typedef std::元组类型;
};

这与您现有的
void

的部分和全部专业化应该可以配合得很好。感谢T.C.快速而清晰的回复。您的解决方案确实适用于VS2013。
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;
};