gpt4 book ai didi

c++ - 添加具有默认类型的模板参数后出现歧义调用

转载 作者:行者123 更新时间:2023-12-03 06:52:13 28 4
gpt4 key购买 nike

#include <iostream>
template<typename T>
class A
{
};
template <typename T, typename T2, typename...Ts, typename = void >
//^remove this compiles
void func(T &&expr, T2 &&case1, Ts &&... args)
{
std::cout << "General\n";
}

template <typename T, typename A_Type, typename...Ts, typename = void>
//^remove this compiles
auto func(T &&expr, A<A_Type>&&, Ts &&... args)
{
std::cout << "A<Type>\n";
}
int main()
{
func(1, A<int>{}, 2); //ambiguous call
}
GCC 10.1 及更早版本给出了一个模棱两可的调用错误,但它可以用 10.2 编译。 Demo here .我想知道这是旧版 GCC 上的错误还是我的代码错误并且不应该编译。
匿名 typename用于一些 SFINAE 的东西,我想要一个解决方法,让它在旧版本的 GCC 上编译。

最佳答案

GCC 错误 96976(已解决;在 GCC 10.2、GCC 11 中实现)
这看起来像 GCC 解决了错误

  • Bug 96976 - g++ reports "call of overloaded '...' is ambiguous" when universal reference is used

  • 最近被标记为已解决

    Jonathan Wakely 2020-09-08 11:56:59 UTC

    Fixed on trunk by r11-1571

    It's also fixed on the gcc-10 branch by r10-8343


    已为 GCC 10.2 和 11 实现了该解决方案。

    Known to work: 10.2.0, 11.0



    解决方法?

    The anonymous typename is for some SFINAE stuff, and I want a workaround to make it compile on older version of GCC.


    正如对错误报告的评论中类似的询问和回答:

    Igor Chorazewicz 2020-09-08 12:17:32 UTC

    [...] Also, do you by any chance, have any ideas how to workaround it for now?

    **Vorfeed Canal 2020-09-09 13:32:20 UTC **

    Why couldn't you use std::enable_if in it's usual (for functions) place?

    Like this:

    template <typename K, typename... Args>
    auto f(K&& k, Args&&... args) -> std::enable_if_t<true, void>
    {
    }

    您可以删除 SFINAE 预期的默认类型模板参数,并使用尾随返回类型语法将 SFINAE 应用于函数的返回类型。

    与右值引用的相关性?
    请注意,尽管错误报告的作者在错误报告的标题中提到了右值引用的问题,但报告中给出的失败示例(在 GCC 主干中已修复)
    #include <type_traits>

    template <typename... Args>
    void f(int &&a, Args&&... args)
    {
    }

    template <typename K, typename... Args, typename = typename std::enable_if<true, K>::type>
    void f(K&& k, Args&&... args)
    {
    }

    int main() {
    f(1, 2);
    return 0;
    }

    如果我们删除 f 的参数的右值引用,同样会失败(/已修复)重载,而这些可能不是此问题的根本原因。

    关于c++ - 添加具有默认类型的模板参数后出现歧义调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64158484/

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