LINUX.ORG.RU

unresolved overloaded function type

 ,


0

1

Привет всем!у меня проблема... значит создал функцию с параметром указатель на функцию

void Graph::show_edge(void (*visit)(const string&, const string&)) const
{
    for(size_t i = 0; i < m_edge.size(); i++)
        for(size_t j = 0; j < m_edge[i].size(); j++)
            if(m_edge[i][j])
                visit(get_vertex(i), get_vertex(j));
}
теперь когда я вызываю эту функцию и вписываю в параметр лямду функцию
else if(boost::regex_match(lineEdit->text().toStdString(), show_vertex))
     {
         pm_graph->show_edge([this](const string& str1, const string& str2)
         {
             pm_show->text_label("Вершина ");
             pm_show->text_label(QString::fromStdString(str1));
             pm_show->text_label(" смежна с вершиной ");
             pm_show->text_label(QString::fromStdString(str2));
             pm_show->text_label("\n");
         });
         pm_show->show_scroll();
     }
компилятор сообщаяет о такой ошибки /home/september/Проекты/visual_graph/visualizer_graph/visualizer.cpp:114: ошибка: no matching function for call to 'Graph::show_edge(Visualizer::slot_perform()::<lambda(const string&, const string&)>)' потом начал делать по другому, т.е. создал функцию
void visit(const string& str1, const string& str2)
    {
        pm_show->text_label("Вершина ");
        pm_show->text_label(QString::fromStdString(str1));
        pm_show->text_label(" смежна с вершиной ");
        pm_show->text_label(QString::fromStdString(str2));
        pm_show->text_label("\n");
    }

потом вызваю метод show_edge c параметром visit

else if(boost::regex_match(lineEdit->text().toStdString(), show_vertex))
     {
         pm_graph->show_edge(visit);
         pm_show->show_scroll();
     }
компилятор выдает такую ошибку /home/september/Проекты/visual_graph/visualizer_graph/visualizer.cpp:107: ошибка: no matching function for call to 'Graph::show_edge(<unresolved overloaded function type>)' кстатит функция show_edge вызываю с слоте - функции... что я делаю не так ? где моя ошибка ?



Последнее исправление: september_valentine (всего исправлений: 1)

где моя ошибка ?

Нельзя передавать функции-члены класса и лямбды для такого параметра:

void (*visit)(const string&, const string&)

kamre ★★★
()
Ответ на: комментарий от xaizek

Действительно можно. Просто раньше это не поддерживалось компиляторами:

Additionally in Visual C++ in Visual Studio 2012, stateless lambdas are convertible to function pointers. ... we've made stateless lambdas convertible to function pointers that have arbitrary calling conventions. This is important when you are using APIs that expect things like __stdcall function pointers

kamre ★★★
()

В месте вызова символ visit не перегружен случайно? И он ведь не является членом класса?

xaizek ★★★★★
()
Ответ на: комментарий от september_valentine

Потому что, грубо говоря, эта штука ценой дополнительных расходов позволяет оборачивать как лямбды, так и обычные функции под один тип.

yoghurt ★★★★★
()
Ответ на: комментарий от september_valentine

Лямбда захватывает this, а значит не преобразуется к указателю на функцию

Uter
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.