Как найти ошибки «boost :: noncopyable»? - PullRequest
4 голосов
/ 21 сентября 2010

В отчаянном сражении с Boost.Asio я столкнулся с множеством трудностей.

Одним из них является то, что я едва могу найти , где "boost :: noncopyable errors" !!

Если я случайно нарушу некопируемые правила, IDE показывает мне только некоторые ошибки в noncopyable.hpp или где-то еще, но нигде в моих файлах .

Я могу находить ошибки только по комментариям и комментариям везде, где существует объект asio.

(ps: моя IDE - это Visual C ++ 2008, у этой IDE плохие отношения с Boost ??)

EDIT:

Я знаю, что чтение сообщения об ошибке whole очень помогает. Но как насчет этого?

1>d:\boost\include\boost-1_42\boost\asio\basic_io_object.hpp(92) : error C2248: 'boost::noncopyable_::noncopyable::noncopyable' : cannot access private member declared in class 'boost::noncopyable_::noncopyable'
1>        d:\boost\include\boost-1_42\boost\noncopyable.hpp(27) : see declaration of 'boost::noncopyable_::noncopyable::noncopyable'
1>        d:\boost\include\boost-1_42\boost\noncopyable.hpp(22) : see declaration of 'boost::noncopyable_::noncopyable'
1>        This diagnostic occurred in the compiler generated function 'boost::asio::basic_io_object<IoObjectService>::basic_io_object(const boost::asio::basic_io_object<IoObjectService> &)'
1>        with
1>        [ IoObjectService=boost::asio::stream_socket_service<boost::asio::ip::tcp>  ]

Все это вызвано

tcp::socket getSocket(){
        return m_socket;
    }

(должно быть:

tcp::socket& getSocket(){
        return m_socket;
    }

)

Когда в этом файле есть много функций, вы, ребята, можете быстро найти его ??

(ps2: возможно, все эти проблемы вызваны моим опытом программирования pooooooor на C ++ ??)

Ответы [ 2 ]

3 голосов
/ 21 сентября 2010

Кажется, VC ++ просто не скажет вам, где находится попытка использовать конструктор копирования.

Например, G ++ делает:

#include <boost/asio.hpp>
using boost::asio::ip::tcp;

class X
{
    tcp::socket s;
public:
    tcp::socket get() { return s; }
};

Результат:

blah blah blah noncopyable blah blah
...
untitled1.cpp: In member function 'boost::asio::blah blah X::get()':
untitled1.cpp:8: note: synthesized method 'boost::asio::blah(const boost::asio::blah&)' first required here

В нескольких случаях мне только что удалось скомпилировать исходный код с помощью GCC, чтобы выяснить сообщения об ошибках VC ++ (и наоборот).

Возможно, также не пишите много неработающего кодане пытаясь время от времени его компилировать.

1 голос
/ 11 августа 2011

Недавно я боролся с подобной проблемой, когда не подлежащий копированию элемент был членом класса, который я хотел вернуть по ссылке.

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

Не очень помогает, если вы возвращаете не копируемый экземпляр класса Boost.

...