ошибка C2182: '*': незаконное использование типа 'void' c: \ boost_1_53_0 \ boost \ smart_ptr \ intrusive_ptr.hpp

Я пытаюсь разработать сервер websocket ++ на своем ноутбуке с Windows 7 для простоты (пока плохо с vi, не хочу постоянно ftp). В конце я перейду на Ubuntu 12.10.

Я использую проект консольного приложения Visual C ++ Win32.

Я included каталог websocketpp, установил boost 1.53.0 Как вы установить Boost.Build в Windows? и included & linked увеличить Повышение связывания, Visual Studio и контроль версий.

Я пытаюсь build print_server.cpp http://www.zaphoyd.com/websocketpp/manual/building-program-websocket

Когда я это делаю, я получаю Error 1 error C2182: '*' : illegal use of type 'void' c:\boost_1_53_0\boost\smart_ptr\intrusive_ptr.hpp Line:155 Column:1

Код повышения (вторая строка - 155):

T & operator*() const
{
    BOOST_ASSERT( px != 0 );
    return *px;
}

Почему я получаю эту ошибку? Как мне это исправить?


person Community    schedule 29.03.2013    source источник
comment
Фактическая ошибка не в заголовке Boost, это то, как вы используете Boost. Где-то вы используете оператор разыменования в интеллектуальном указателе Boost, который имеет тип void.   -  person Some programmer dude    schedule 29.03.2013


Ответы (1)


Это известная проблема при компиляции с использованием ускорения на VCPP. WebSocket ++ 0.3 не использует intrusive_ptr, но использует static_pointer_cast. Каждый интеллектуальный указатель boost реализует свою собственную перегрузку boost :: static_pointer_cast. VCPP, похоже, не может выбрать правильную перегрузку при статическом преобразовании shared_ptr<void> в shared_ptr<connection_ptr>. И Clang, и GCC используют правильную перегрузку, а VCPP - нет. У меня есть небольшая демонстрационная программа, демонстрирующая эту проблему, которую я собирался очистить и спросить о переполнении стека ...

А пока простое исправление - сказать WebSocket ++ использовать C ++ 11, а не увеличивать интеллектуальные указатели. VCPP правильно работает с std :: static_pointer_cast / std :: shared_ptr. Согласно http://www.zaphoyd.com/websocketpp/manual/reference/cpp11-support, определяющая _WEBSOCKETPP_CPP11_MEMORY_ перед включением заголовков WebSocket ++, выполнит это. Я протестировал реализацию C ++ 11 <memory> в VCPP2010, и она реализует все, что нужно WebSocket ++.

person zaphoyd    schedule 29.03.2013