2012-07-02 3 views
3

Вчера я установил clang 3.1 и g ++ 4.7 и попытался скомпилировать проект, над которым я работаю. Я был удивлен, увидев, что он не компилируется с использованием обоих компиляторов. Но меня больше всего удивляет то, что проблема в boost::shared_ptr.Ошибка при создании сборки boost :: shared_ptr с использованием C++ 11

По-видимому, поскольку этот класс определяет оператор-конструктор перемещения/присваивания, конструктор копирования неявно удаляется. Таким образом, этот код:

#include <boost/shared_ptr.hpp> 

int main() { 
    boost::shared_ptr<int> x; 
    boost::shared_ptr<int> y(x); 
} 

Не компилируется. лязг повторяет эту ошибку:

test.cpp:5:28: error: call to implicitly-deleted copy constructor of 
     'boost::shared_ptr<int>' 
    boost::shared_ptr<int> y(x); 
         ^~ 
/usr/include/boost/smart_ptr/shared_ptr.hpp:347:5: note: copy constructor is 
     implicitly deleted because 'shared_ptr<int>' has a user-declared move 
     constructor 
    shared_ptr(shared_ptr && r): px(r.px), pn() // never throws 
    ^

г ++ 4.7 обеспечивает подобную ошибку, ссылаясь на неявно удаляемого конструктор, а также. Странно то, что boost::shared_ptr, на самом деле явно определяет конструктор копирования (повышение/smart_ptr/shared_ptr.hpp линия 228):

template<class Y> 
#if !defined(BOOST_SP_NO_SP_CONVERTIBLE) 

    shared_ptr(shared_ptr<Y> const & r, typename boost::detail::sp_enable_if_convertible<Y,T>::type = boost::detail::sp_empty()) 

#else 

    shared_ptr(shared_ptr<Y> const & r) 

#endif 
    : px(r.px), pn(r.pn) // never throws 
    { 
    } 

Я использую импульс 1.48.0.2, который является довольно новым. Кто-нибудь знает, что здесь происходит? Почему конструктор копирования не обнаруживается, когда он определен? Является ли это исправлено в новых версиях библиотеки интеллектуальных указателей? Я ничего не мог найти в списках изменений.

+5

Boost 1.48 не является новым, его 8 месяцев (1.50 является текущим), и поскольку он был выпущен, исправлены _many_ C++ 11 исправления. Я бы сказал, что шаг 1 проверяет, что это работает в более новой версии Boost (или просто используйте 'std :: shared_ptr' вместо этого). – ildjarn

+0

@Gigi такой же проблема. ildjarn Да, 8 месяцев для меня довольно нова. Дело в том, что я не понимаю, почему, черт возьми, он не работает, поскольку конструктор копирования фактически определен. Во всяком случае, мне, вероятно, придется обновлять свои библиотеки boost. – mfontanini

+1

@mfontanini: 8 месяцев довольно старый в терминах Boost, особенно в терминах поддержки компилятора с кровотечением. : -] – ildjarn

ответ

5

Это известная ошибка в Boost. Более старые версии (1.48 и ниже) Boost не компилируются под C++ 11, по крайней мере, не все. Лично я использую этот обходной путь:

#ifdef MY_LIB_COMPILING_UNDER_CXX11 

#include <memory> 

namespace my_lib { 

using std::shared_ptr; 
using std::weak_ptr; 

}; 

#else 

#include <boost/shared_ptr.hpp> 
#include <boost/weak_ptr.hpp> 

namespace my_lib { 

using boost::shared_ptr; 
using boost::weak_ptr; 

}; 

#endif 

MY_LIB_COMPILING_UNDER_CXX11 Где бы флаг, который вы задали либо передать компилятору или выводе его из C++ 11 флагов компилятора. И, тогда, в остальной библиотеке я использую только my_lib::shared_ptr. Это работает очень хорошо.

+1

Проблема в том, что я не использую 'boost :: shared_ptr', но' boost :: asio' есть. Поэтому я не могу этого сделать. Во всяком случае, +1 для указания, что это известная ошибка. Я, вероятно, сделаю, что ildjarn говорит и обновляет мои библиотеки boost. – mfontanini

+1

Я проверил, и, по-видимому, он исправлен с версии 1.48.0. Но он не говорит о том, какая версия, поэтому я должен предположить, что она исправлена ​​из версии 1.48.0.3 (поскольку вы протестировали с 1.48.0.2, и она потерпела неудачу, а 1.48.0.3 - последняя незначительная ревизия в 1.48.0). –

+0

Спасибо, что проверили! Я обновился до последней версии, и теперь он отлично работает. – mfontanini

Смежные вопросы