为什么模板参数推导/替换在代码中失败?-

时间:2019-04-26 11:05:37

标签: c++ templates gcc

我正在使用编译器g ++ 6.3.0(c ++ 14)。 在代码中-

select sum(nb.byUrl)
from
(  select count(U.UrlId) as byUrl
   from Urls U
   inner join OrderPositions OP on U.UrlId = OP.UrlId
   inner join Orders O on O.OrderId = OP.OrderId
   group by (U.Url)
   having count(OP.OrderId) >= 2
) nb

编译器无法推断g的返回类型。 它显示以下错误-

#include<iostream>

int f(auto a){return a;}

int f1(auto (*g)(int),int a) {return g(a);}

main()
{
    std::cout<< f1(f,8);
}

但是代码中没有错误-

temp.cpp: In function 'int main()':
temp.cpp:9:20: error: no matching function for call to 'f1(<unresolved overloaded function type>, int)'
  std::cout<< f1(f,8);
                    ^
temp.cpp:5:5: note: candidate: template<class auto:2> int f1(auto:2 (*)(int), int)
 int f1(auto (*g)(int),int a) {return g(a);}
     ^~
temp.cpp:5:5: note:   template argument deduction/substitution failed:
temp.cpp:9:20: note:   couldn't deduce template parameter 'auto:2'
  std::cout<< f1(f,8);
                    ^

帮助我了解错误...

1 个答案:

答案 0 :(得分:4)

int f(auto a){return a;}

等同于

template <typename T>
int f(T a){return a;}

您不能使用模板(或重载集)的地址-这就是为什么看到此错误的原因。解决方法:

  • 获取所需实例化的地址:

    return f1(f<int>,8);
    
  • f1接受auto并传递lambda:

    int f1(auto g, int a) {return g(a);}
    
    int main()
    {
        std::cout<< f1([](auto x){ f(x); },8);
    }