gpt4 book ai didi

C++ 可变参数模板实例化深度超过最大值 900

转载 作者:太空狗 更新时间:2023-10-29 20:33:54 26 4
gpt4 key购买 nike

我正在使用 C++11 可变参数模板,但是编译器提示模板实例化深度超过最大值 900,代码如下所示:

template<typename F1, typename F2>
composed<F1, F2> compose(F1 f1, F2 f2) {
return composed<F1, F2>(f1, f2);
}
template<typename F1, typename F2, typename... Fs>
auto compose(F1 f1, F2 f2, Fs... fs) ->decltype(compose(compose(f1, f2), fs...)) {
return compose(compose(f1, f2), fs...);
}

我正在使用这个模板:

auto composed_func = compose(f1, f2, f3, f4);

但是如果我将可变参数模板定义更改为:

template<typename F1, typename F2, typename F3, typename... Fs>
auto compose(F1 f1, F2 f2, F3 f3, Fs... fs) ->decltype(compose(compose(f1, f2), f3, fs...)) {
return compose(compose(f1, f2), f3, fs...);
}

它会正常工作。我不清楚为什么会这样。在我看来,上面的用法看起来也有效,因为它仍然递归地减少 args 以调用 compose。

最佳答案

您可以通过以下方式修复它:

template<typename F1, typename F2>
composed<F1, F2> compose(F1 f1, F2 f2) {
return composed<F1, F2>(f1, f2);
}

template<typename F1, typename F2, typename... Fs>
auto compose(F1 f1, F2 f2, Fs... fs)
->decltype(compose(::compose(f1, f2), fs...))
{
return compose(compose(f1, f2), fs...);
}

Demo

ADL 可以找到不合格的名称,名称是在实例化时搜索的。

因此,通过不合格的查找,我们首先生成了候选人(即使他们不是更好的匹配)

compose(f, g)可以是:

  • template<typename F1, typename F2> compose
  • template<typename F1, typename F2, typename...Fs> compose . (带 FS 空包)

对于后一种情况,我们有 decltype(compose(compose(f, g)))解决等等compose(f, g)再次 -> 无限递归。

另一方面,限定名称是立即搜索的,并且只能找到完整声明的函数(因此不能找到它本身,因为尾随返回类型是声明的一部分)。所以::compose避免将自己视为过载的候选对象。

关于C++ 可变参数模板实例化深度超过最大值 900,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52196212/

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