目前,我正试图从作为参数传递的几个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):
#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;
}
发布于 2022-07-17 02:47:11
MSVC在/permissive
模式下运行时存在一些一致性问题,并且“微软C++编译器在最初解析模板时目前不支持绑定非依赖的名称。这不符合C++ 11 ISO规范第14.6.3节的规定。这可能导致在模板之后(但在模板实例化之前)声明的重载。”
如果您使用/permissive-
“编译器.实现了更多两阶段名称查找的要求”,并将按原样编译您的程序。
还请注意,您实际上并没有使用C++11。MSVC 19.24支持C++14和up。
https://stackoverflow.com/questions/73008749
复制相似问题