在编写一些模板代码时,我遇到了<unresolved overloaded function type>
错误,这些错误可以简化为以下内容。
template <int N>
auto bar()
{
return N;
}
int main(int, char* [])
{
auto foo = [] (auto func) {
return func();
};
foo(bar<3>);
}
错误是:
unresolved_overload.cpp: In function 'int main(int, char**)':
unresolved_overload.cpp:26:28: error: no match for call to '(main(int, char**)::<lambda(auto:1)>) (<unresolved overloaded function type>)'
std::cout << foo(bar<3>) << std::endl;
^
unresolved_overload.cpp:21:29: note: candidate: template<class auto:1> constexpr main(int, char**)::<lambda(auto:1)>::operator decltype (((const main(int, char**)::<lambda(auto:1)>*)((const main(int, char**)::<lambda(auto:1)>* const)0))->operator()(static_cast<auto:1&&>(<anonymous>))) (*)(auto:1)() const
auto foo = [] (auto func) {
^
unresolved_overload.cpp:21:29: note: template argument deduction/substitution failed:
unresolved_overload.cpp:26:28: note: couldn't deduce template parameter 'auto:1'
std::cout << foo(bar<3>) << std::endl;
^
unresolved_overload.cpp:21:29: note: candidate: template<class auto:1> main(int, char**)::<lambda(auto:1)>
auto foo = [] (auto func) {
^
unresolved_overload.cpp:21:29: note: template argument deduction/substitution failed:
unresolved_overload.cpp:26:28: note: couldn't deduce template parameter 'auto:1'
std::cout << foo(bar<3>) << std::endl;
如果我们用显式返回类型int
替换自动返回,示例将编译正常。
为什么自动返回会遇到这些问题?我查看了模板参数推导和替换,但搜索基本上没有用。我认为它可能与模板实例化/等等的顺序有关,但是对它没有多大意义......
答案 0 :(得分:2)
Per AndyG的建议,我在GCC的错误列表中发现了同样的问题。 Bug 64194。首先在2014年报告。因此结论似乎是这是一个GCC错误,幸好不是另一个模板的特殊情况。
解决这个问题只需要用其他东西来触发实例化(例如分配给变量,using
声明)。
答案 1 :(得分:0)
试试这个:
template <typename func>
auto bar(func&& f)->decltype(f())
{
return f();
}
int main()
{
int i = 100;
auto f = [=]()
{
return i;
};
bar(f);
return 0;
}