gpt4 book ai didi

c++ - VS2013 C++ C1001 错误与 std::tuple_cat

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:17:57 25 4
gpt4 key购买 nike

我最近将 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 错误?

预先感谢您的帮助。

最佳答案

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 的部分和完全特化一起工作.

关于c++ - VS2013 C++ C1001 错误与 std::tuple_cat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30769409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com