27 / 27 / 18
Регистрация: 13.09.2014
Сообщений: 137
1

Приведение типов: "no matching overloaded function found"

19.03.2016, 03:29. Показов 4462. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template<class T> int foo(T) { return 1; }
 
template<class T> bool foo(T) { return true; }
 
void foo() {}
 
int main() {
    auto& f = (void(&)())foo;
    auto b = (bool(*)(int))&foo<int>;
    auto& b2 = ((bool(&)(int))foo<int>);
    auto b3 = ((bool(*)(int))foo<int>)(10);
    //auto b4 = ((bool(&)(int))foo<int>)(10);//compilation error
    std::cin.get();
    return 0;
}
Error C2672 'foo': no matching overloaded function found
Error C3861 'foo': identifier not found
Что не так?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.03.2016, 03:29
Ответы с готовыми решениями:

Std::invoke: no matching overloaded function found
мне нужно передать в объект thread функцию класса MyClass. не пойму почему выдается ошибка ...

overloaded member function not found
Что означает данное сообщение об ошибке - 'counter counter::operator +(counter &amp;)' : overloaded...

overОшибка: overloaded member function not found in 'shtraf'
Помогите, пожалуйста, а то уже идеи не идут в голову Так нельзя писать, как я написла ( в...

No overloaded function with same arguments
Хочу, чтобы при загрузке формы в listBox1 добавлялись названия папок в директории Main корневого...

No instance of overloaded function
case 2: std::cout &lt;&lt; &quot;Введите кол-во новых записей: &quot;; std::cin &gt;&gt; newRN; for(int i=0;...

5
13 / 13 / 24
Регистрация: 06.03.2016
Сообщений: 61
19.03.2016, 08:11 2
C++
1
2
3
4
5
6
7
8
9
10
11
// приводим экземпляр функции к типу ссылки на указатель
// f - ссылка на указатель
auto& f = (int(&)(int))&foo<int>;
// тоже самое, только просто указатель, без ссылки
auto b = (bool(*)(int))&foo<int>;
// тоже самое что и в первом случае, только тип функции другой и опускаем &, который по сути не нужен
auto& b2 = (bool(&)(int))foo<int>;
// b3 это тип bool, который получается вызовом функции через указатель
auto b3 = ((bool(*)(int))foo<int>)(10);
// здесь нет ошибки, тоже самое что предыдущее, только вызываем через ссылку на указатель
auto b4 = ((bool(&)(int))foo<int>)(10);
C++
1
2
3
// Ошибка:
// нет функции void()()
auto& f = (void(&)())foo;
C++
1
2
// Можно еще написать так:
auto& f = (int(&)(int))foo;
0
27 / 27 / 18
Регистрация: 13.09.2014
Сообщений: 137
19.03.2016, 17:05  [ТС] 3
k1n3c7,
Начну по порядку:
1)
C++
1
auto& f = (int(&)(int))&foo<int>;
На прикрепленных картинках видно, что 15 студия выдает предупреждение, но компилирует. Ок.
(Мне кажется, такой код вообще не должен компилироваться. &foo - это указатель на функцию, а мы кастуем его к ссылке.)
2) Вы говорите, что
f - ссылка на указатель
, но в коде ниже ничего не выводится:
C++
1
2
3
    auto& f = (int(&)(int))&foo<int>;
    if (typeid(int(*&)(int)) == typeid(f))
        std::cout << typeid(f).name() << std::endl;
А на это:
C++
1
int(*& qq)(int) = f;
студия выдает
C++
1
'initializing': cannot convert from 'int (__cdecl &)(int)' to 'int (__cdecl *&)(int)'
Значит это ссылка, а не ссылка на указатель.
3) Этот код вообще не компилируется:
C++
1
auto b4 = ((bool(&)(int))foo<int>)(10);
C++
1
2
Error C2672 'foo': no matching overloaded function found
Error C3861 'foo': identifier not found
4) Функция
C++
1
void foo() {}
в моем сообщении присутствует, и код ниже компилируется:
C++
1
auto& a = (void(&)())foo;
Миниатюры
Приведение типов: "no matching overloaded function found"   Приведение типов: "no matching overloaded function found"  
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.03.2016, 18:01 4
Цитата Сообщение от notemac Посмотреть сообщение
auto b4 = ((bool(&)(int))foo<int>)(10);//compilation error
студийный баг.

обходной путь:

C++
1
2
auto b4_ = (bool(&)(int))foo<int>;
auto b4 = b4_(10);
0
27 / 27 / 18
Регистрация: 13.09.2014
Сообщений: 137
19.03.2016, 21:31  [ТС] 5
C++
1
2
auto b4_ = (bool(&)(int))foo<int>;
auto b4 = b4_(10);
Хочется отметить, что в этом случае, хоть и кастуем к типу ссылку, b4_ будет иметь тип указателя.
Ссылка соответственно:
C++
1
auto& b4_ = (bool(&)(int))foo<int>;
Делаю такие выводы из typeid(X).name(). В отладчике в студии показывается тип указателя и для ссылки и для указателя.
0
13 / 13 / 24
Регистрация: 06.03.2016
Сообщений: 61
20.03.2016, 02:58 6
notemac, думаю вы правы, видимо все проблемы из-за того что ваш компилятор действительно считает это ссылкой на тип функции, а не ссылкой на указатель на функцию.
Предложу другой альтернативный способ, не знаю заработает ли он у вас, но по идее должен, поскольку это пример почти что-то из учебника.
Указатель на функцию:
C++
1
int(*f)(int) = &foo<int>;
Ссылка на указатель на функцию:
C++
1
int(*&rf)(int) = f;
В одно действие (тут const, поскольку указатель rvalue):
C++
1
bool(* const &rf2)(int) = &foo<int>;
Ну а потом уже вычисляете что вам нужно с помощью этих функций.
Единственное я не уверен что он у вас выберет нужную функцию.
0
20.03.2016, 02:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.03.2016, 02:58
Помогаю со студенческими работами здесь

No instance of overloaded function
Выдаёт ошибку No instance of overloaded function any_cast() void CXmlStorage::SaveTable(LPCTSTR...

Ambiguous access to overloaded function
Zdravstvuite,mogli li bi vi mne ob'qsnit' pochemy ne realiziruetsq kompilqtorom?Ponimaiu chto eto...

Abiguous call to overloaded function
Рисую в opengl вентилятор Это - фрагмент кода, который рисует лопасть вентилятора. Тут...

No overloaded function takes 3 arguments
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; #include &quot;conio.h&quot;...

Ambiguous call to overloaded function
При использовании sqrt (да и других мат. функций(sin, cos, pow...) ) выдает ошибку, где говорится о...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru