почему в коде не удалось вывести / заменить аргумент шаблона? - PullRequest
3 голосов
/ 26 апреля 2019

Я использую компилятор g ++ 6.3.0 (c ++ 14).В коде -

#include<iostream>

int f(auto a){return a;}

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

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

Компилятор не может определить тип возвращаемого значения g.Это показывает следующее сообщение об ошибке -

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

Но в коде нет ошибки -

#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);
}

Помогите мне понять ошибку ...

1 Ответ

4 голосов
/ 26 апреля 2019
int f(auto a){return a;}

эквивалентно

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

Вы не можете получить адрес шаблона (или набора перегрузки) - вот почему вы видите эту ошибку. Обходные:

  • Возьмите адрес нужной вам инстанции:

    return f1(f<int>,8);
    
  • Заставить f1 принять auto и передать лямбду:

    int f1(auto g, int a) {return g(a);}
    
    int main()
    {
        std::cout<< f1([](auto x){ f(x); },8);
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...