首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么编译器发出模板递归错误?

为什么编译器发出模板递归错误?
EN

Stack Overflow用户
提问于 2022-07-17 01:47:06
回答 1查看 74关注 0票数 1

目前,我正试图从作为参数传递的几个std::向量中推断出std::tuple类型。我的代码使用gcc可以很好地工作,但是在2019中编译失败,其消息是“致命错误C1202:递归类型或函数依赖关系上下文太复杂”。

我在上一篇文章(C++ "fatal error C1202: recursive type or function dependency context too complex" in visual studio, but gcc compiles)中提到,这个问题是由模板递归引起的,正如C++ template compilation error - recursive type or function dependency中所解释的那样。但是,我不知道递归在哪里发生。

所以我的问题是:

为什么会有(无限)递归?如何解决这一问题?

下面是代码(我绑定到C++11):

代码语言:javascript
运行
复制
#include <tuple>
#include <vector>

template <typename TT,typename Add>
auto addTupBase(TT t,std::vector<Add> a) ->decltype (std::tuple_cat(t,std::make_tuple(a[0])))
{
  return std::tuple_cat(t,std::make_tuple(a[0])) ;
}

template <typename TT,typename Add,typename... Args>
auto addTupBase(TT t,std::vector<Add> a,Args... args)-> decltype(addTupBase(addTupBase(t,a),args...))
{
  return addTupBase(addTupBase(t,a),args...);
}


template <typename T,typename... Args>
auto addTup(std::vector<T> in,Args... args) ->decltype(addTupBase(std::make_tuple(in[0]),args...))
{
  return addTupBase(std::make_tuple(in[0]),args...);
}

int main()
{
  using TupleType = decltype(addTup(std::vector<char>{2},std::vector<int>{5},std::vector<double>{32423}));
  TupleType t;
  std::get<2>(t) = 342.2;
  return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-17 02:47:11

MSVC在/permissive模式下运行时存在一些一致性问题,并且“微软C++编译器在最初解析模板时目前不支持绑定非依赖的名称。这不符合C++ 11 ISO规范第14.6.3节的规定。这可能导致在模板之后(但在模板实例化之前)声明的重载。”

如果您使用/permissive-“编译器.实现了更多两阶段名称查找的要求”,并将按原样编译您的程序。

还请注意,您实际上并没有使用C++11。MSVC 19.24支持C++14和up。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73008749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档