简体   繁体   中英

why the template argument deduction/substitution failed in the code?-

I am using compiler g++ 6.3.0 (c++14). In the code-

#include<iostream>

int f(auto a){return a;}

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

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

Compiler is not able to deduce the return type of g. It shows following error-

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);
                    ^

But no error comes in the code-

#include<iostream>

int f(int /* <<<<< */ a){return a;} // only (auto a) is changed to (int a)

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

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

Help me understand the error...

int f(auto a){return a;}

is equivalent to

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

You cannot take the address of a template (or overload set) - that is why you're seeing that error. Workarounds:

  • Take the address of the instantiation you want:

     return f1(f<int>,8); 
  • Make f1 accept auto and pass a lambda:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM