Использование Bind для создания функции без параметров приводит к ошибке - PullRequest
0 голосов
/ 20 декабря 2011

Я пытаюсь выяснить правильное использование std :: bind с сигналом boost :: signal2.

Набор ошибок, который я получаю с помощью clang ++ (из Xcode 4.2.1):

~/Projects/Myron/Myron/main.cpp:29:59: error: reference to '_1' is ambiguous [3]
     main.resize.connect(std::bind(resize, std::ref(main), _1, _2));
                                                           ^
/Developer/usr/bin/../lib/c++/v1/functional:1496:18: note: candidate found by name lookup is 'std::__1::placeholders::_1' [3]
 extern __ph<1>   _1;
                  ^
/Developer/SDKs/MacOSX10.7.sdk/usr/local/include/boost/bind/placeholders.hpp:55:15: note: candidate found by name lookup is '<anonymous namespace>::_1' [3]
 boost::arg<1> _1;
               ^
~/Projects/Myron/Myron/main.cpp:30:24:{30:24-30:33}: error: no matching function for call to 'bind' [3]
     main.close.connect(std::bind(close, std::ref(main)));
                        ^~~~~~~~~
/Developer/usr/bin/../lib/c++/v1/functional:1789:1: note: candidate template ignored: couldn't infer template argument '_F' [3]
 bind(_F&& __f, _BoundArgs&&... __bound_args)
 ^
/Developer/usr/bin/../lib/c++/v1/functional:1798:1: note: candidate template ignored: couldn't infer template argument '_R' [3]
 bind(_F&& __f, _BoundArgs&&... __bound_args)
 ^
2 errors generated.

Они в основном сосредоточены на двух строках:

main.resize.connect(std::bind(resize, std::ref(main), _1, _2));
main.close.connect(std::bind(close, std::ref(main)));

Которые используют прототипы функций:

bool resize(Myron::Window &win, int &width, int &height);
bool close(Myron::Window &win);

, а main - это Myron :: Window &, а также изменение размера и закрытие:

bs2::signal<bool(int&,int&)> resize;
bs2::signal<bool(void)> close;

Все, что я прочитал и было сказанозаставляет меня поверить, что я использую их достаточно правильно, поэтому я не уверен, в чем проблема.

Я понимаю, что первая ошибка - это проблема с boost :: bind, которая, вероятно, пробилась сюда через boost /signal2.hpp в файле Myron.h.Вторая ошибка, скорее загадка.

Полный основной исходный файл находится здесь:

#include <iostream>
#include <functional>
#include <string>
#include <type_traits>

#include "Myron.h"

bool setup();
bool resize(Myron::Window &win, int &width, int &height);
bool close(Myron::Window &win);


bool setup()
{
    using namespace std::placeholders;

    std::cout << "setup()" << std::endl;
    Myron::Window &main = Myron::createWindow(640, 480);

    main.resize.connect(std::bind(resize, std::ref(main), _1, _2));
    main.close.connect(std::bind(close, std::ref(main)));
    return true;
}

bool close(Myron::Window &win)
{
    std::cout << "Window Closed" << std::endl;
    return true;
}

bool resize(Myron::Window &win, int &width, int &height)
{
    std::cout << "Resize: " << width << ", " << height << std::endl;
    return true;
}



int main(int argc, char**argv)
{
    std::cout << "Initialize..." << std::endl;

    Myron::Init(setup);

    std::cout << "Done Initialize." << std::endl;
}

Где находится главный репозиторий исходного кода, показывающий все здесь: https://github.com/iaefai/Myron/tree/master/Myron

Буду признателен за любые рекомендации.Я попытался сделать меньшие контрольные примеры без успеха, чтобы выявить проблему.

1 Ответ

0 голосов
/ 20 декабря 2011

Вторая проблема, вероятно, вызвана неоднозначностью перегрузки. В частности, я подозреваю, что виновником является системный вызов close(), который проникает в вашу область с помощью <iostream>. Попробуйте заключить ваши обратные вызовы в пространство имен и посмотрите, поможет ли это. Я удивлен, что clang ++ не более полезен в этом случае, демонстрируя перегрузки, которые вызывают неоднозначность, его обычно хвалят за его очень четкую диагностику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...