首页 > 解决方案 > gcc中未解决的重载函数类型

问题描述

我正在尝试将函数模板作为参数传递给另一个函数,如下例所示。

#include <iostream>

template <typename T>
decltype(auto) foo(T t)
{
    return t;
}

template <typename Fn, typename T>
decltype(auto) bar(Fn fn, T t)
{
    return fn(t);
}

int main()
{
    int arg = 0;

    std::cout << bar(foo<decltype(arg)>, arg) << std::endl;

    return 0;
}

虽然这适用于 clang 9.0 和 msvc v19.24,但它在 gcc 9.2 中失败

gcc 输出:

no matching function for call to 'bar(<unresolved overloaded function type>, int&)' std::cout << bar(foo<decltype(arg)>, arg) << std::endl;

这是gcc中的错误吗?我也可以在 gcc 中以某种方式规避这个问题吗?

Godbolt 链接:https ://godbolt.org/z/oCChAT

标签: c++templatesgccc++14function-templates

解决方案


对于 gcc,另一种解决方法是:

auto f = foo<decltype(arg)>;
std::cout << bar(f, arg) << std::endl;

推荐阅读