2011-12-23 41 views
1

boost::filesystem::directory_iterator reference(v1.48)說directory_iterator顯式定義了一個拷貝構造函數。我只是看着the code,它不會,大概讓編譯器定義copy-ctor。boost :: filesystem :: directory_iterator copy-ctor implictly deleted

在編譯器爲該類型生成移動對象的情況下會發生這種情況,隨後發現該隱式拷貝對象會不合格並因此刪除該拷貝對象?我還沒有用簡單而簡潔的代碼片段複製它,但似乎是在我的代碼中使用2011年12月17日的gcc 4.7快照進行的操作。儘管如此,我在gcc 4.6.1中沒有這個問題。

這裏是錯誤的,從GCC 4.7味道:

In file included from /usr/local/include/boost/iterator/interoperable.hpp:13:0, 
       from /usr/local/include/boost/iterator/iterator_facade.hpp:11, 
       from /usr/local/include/boost/filesystem/v3/path.hpp:28, 
       from /usr/local/include/boost/filesystem/path.hpp:31, 
       from /Users/matan/Development/ouch.git/src/include/ouch/operations.hh:4, 
       from /Users/matan/Development/ouch.git/src/libouch/operations.cc:1: 
/usr/local/include/boost/type_traits/is_convertible.hpp: In instantiation of 'const bool boost::detail::is_convertible_basic_impl<boost::filesystem3::directory_iterator&, boost::filesystem3::directory_iterator>::value': 
/usr/local/include/boost/type_traits/is_convertible.hpp:296:272: required from 'const bool boost::detail::is_convertible_impl<boost::filesystem3::directory_iterator, boost::filesystem3::directory_iterator>::value' 
/usr/local/include/boost/type_traits/is_convertible.hpp:419:47: required from 'struct boost::is_convertible<boost::filesystem3::directory_iterator, boost::filesystem3::directory_iterator>' 
/usr/local/include/boost/mpl/aux_/nested_type_wknd.hpp:26:31: required from 'struct boost::mpl::aux::nested_type_wknd<boost::is_convertible<boost::filesystem3::directory_iterator, boost::filesystem3::directory_iterator> >' 
/usr/local/include/boost/mpl/aux_/preprocessed/gcc/or.hpp:48:8: required from 'struct boost::mpl::or_<boost::is_convertible<boost::filesystem3::directory_iterator, boost::filesystem3::directory_iterator>, boost::is_convertible<boost::filesystem3::directory_iterator, boost::filesystem3::directory_iterator>, mpl_::bool_<false>, mpl_::bool_<false>, mpl_::bool_<false> >' 
/usr/local/include/boost/iterator/detail/enable_if.hpp:68:12: required from 'struct boost::iterators::enable_if<boost::mpl::or_<boost::is_convertible<boost::filesystem3::directory_iterator, boost::filesystem3::directory_iterator>, boost::is_convertible<boost::filesystem3::directory_iterator, boost::filesystem3::directory_iterator>, mpl_::bool_<false>, mpl_::bool_<false>, mpl_::bool_<false> >, bool>' 
/usr/local/include/boost/iterator/iterator_facade.hpp:67:12: required from 'struct boost::detail::enable_if_interoperable<boost::filesystem3::directory_iterator, boost::filesystem3::directory_iterator, bool>' 
/usr/local/include/boost/iterator/iterator_facade.hpp:837:323: required by substitution of 'template<class Derived1, class V1, class TC1, class Reference1, class Difference1, class Derived2, class V2, class TC2, class Reference2, class Difference2> typename boost::detail::enable_if_interoperable<Derived1, Derived2, typename boost::mpl::apply2<boost::detail::always_bool2, Derived1, Derived2>::type>::type boost::operator!=(const boost::iterator_facade<Derived1, V1, TC1, Reference1, Difference1>&, const boost::iterator_facade<Derived2, V2, TC2, Reference2, Difference2>&) [with Derived1 = boost::filesystem3::directory_iterator; V1 = boost::filesystem3::directory_entry; TC1 = boost::single_pass_traversal_tag; Reference1 = boost::filesystem3::directory_entry&; Difference1 = long int; Derived2 = boost::filesystem3::directory_iterator; V2 = boost::filesystem3::directory_entry; TC2 = boost::single_pass_traversal_tag; Reference2 = boost::filesystem3::directory_entry&; Difference2 = long int]' 
/usr/local/include/boost/filesystem/v3/operations.hpp:691:49: required from here 
/usr/local/include/boost/type_traits/is_convertible.hpp:137:49: error: use of deleted function 'boost::filesystem3::directory_iterator::directory_iterator(const boost::filesystem3::directory_iterator&)' 
In file included from /usr/local/include/boost/filesystem/operations.hpp:31:0, 
       from /Users/matan/Development/ouch.git/src/libouch/operations.cc:4: 
/usr/local/include/boost/filesystem/v3/operations.hpp:581:9: note: 'boost::filesystem3::directory_iterator::directory_iterator(const boost::filesystem3::directory_iterator&)' is implicitly deleted because the default definition would be ill-formed: 
/usr/local/include/boost/filesystem/v3/operations.hpp:581:9: error: use of deleted function 'boost::shared_ptr<boost::filesystem3::detail::dir_itr_imp>::shared_ptr(const boost::shared_ptr<boost::filesystem3::detail::dir_itr_imp>&)' 
+0

你可以發佈一些你的代碼,使錯誤發生? –

+0

我遇到了GCC 5.1和Clang 3.8的問題,可能是因爲我使用了過時的Boost 1.46.1 –

回答

0

是,一種類型可以很容易地移動,但不可拷貝。例如,如果它具有不可複製但可移動的成員或基類。在C++ 11中可能是std :: fstream。

在這種情況下,編譯器可以爲您的類創建移動構造函數,但會將複製構造函數聲明爲已刪除。

相關問題