Błąd #3811
Problem z kompilacją z Boostem 1.48
Status: | Rozwiązany | Start date: | 27 Feb 2012 | |
---|---|---|---|---|
Priority: | Normalny | Due date: | ||
Assignee: | Tomasz Śniatowski | % Done: | 100% | |
Category: | - | |||
Target version: | - |
Description
Bład pojawia się w module variables w funkcji reset (reset_cośtam?) przy okazji użycia boost::mpl
do iteracji po typach. Nie mam pod ręką całego komunikatu, ale chodzi o operator= i podmianę zawartości shared_ptr<T>, gdzie T to SymSet (pewnie analogiczny problem pojawiłby się przy każdym typie).
Prawdopodobnie problem pojawia się przy użyciu boosta 1.48.
History
#1 Updated by Tomasz Śniatowski over 11 years ago
Wklejta errora i odpowiedni kawalek kodu to moze zerkne ;)
#2 Updated by Adam Radziszewski over 11 years ago
:) Postawiłem VM-kę, jak wrócę z zajęć to skompiluję i podeślę komunikat (na tamtej maszynie potrzebny był tu i teraz działający WCCL, więc cofnęli boosta).
#3 Updated by Adam Radziszewski over 11 years ago
Okej, a zatem:
/home/eliasz/wccl/libwccl/variables.cpp: In member function ‘void Wccl::{anonymous}::resethelper::operator()(const boost::mpl::always<T>&) [with T = Wccl::StrSet]’: /usr/local/include/boost/mpl/for_each.hpp:78:9: recursively instantiated from ‘static void boost::mpl::aux::for_each_impl<false>::execute(Iterator*, LastIterator*, TransformFunc*, F) [with Iterator = boost::mpl::l_iter<boost::mpl::list4<Wccl::Position, Wccl::StrSet, Wccl::TSet, Wccl::Match> >, LastIterator = boost::mpl::l_iter<boost::mpl::l_end>, TransformFunc = boost::mpl::always<mpl_::arg<1> >, F = Wccl::{anonymous}::resethelper]’ /usr/local/include/boost/mpl/for_each.hpp:78:9: instantiated from ‘static void boost::mpl::aux::for_each_impl<false>::execute(Iterator*, LastIterator*, TransformFunc*, F) [with Iterator = boost::mpl::l_iter<boost::mpl::list5<Wccl::Bool, Wccl::Position, Wccl::StrSet, Wccl::TSet, Wccl::Match> >, LastIterator = boost::mpl::l_iter<boost::mpl::l_end>, TransformFunc = boost::mpl::always<mpl_::arg<1> >, F = Wccl::{anonymous}::resethelper]’ /usr/local/include/boost/mpl/for_each.hpp:100:5: instantiated from ‘void boost::mpl::for_each(F, Sequence*, TransformOp*) [with Sequence = boost::mpl::list5<Wccl::Bool, Wccl::Position, Wccl::StrSet, Wccl::TSet, Wccl::Match>, TransformOp = boost::mpl::always<mpl_::arg<1> >, F = Wccl::{anonymous}::resethelper]’ /home/eliasz/wccl/libwccl/variables.cpp:112:21: instantiated from here /home/eliasz/wccl/libwccl/variables.cpp:101:4: error: no match for ‘operator=’ in ‘a.std::pair<std::basic_string<char>, boost::shared_ptr<Wccl::StrSet> >::second.boost::shared_ptr<T>::operator* [with T = Wccl::StrSet, boost::shared_ptr<T>::reference = Wccl::StrSet&]() = Wccl::StrSet()’ /home/eliasz/wccl/libwccl/variables.cpp:101:4: note: candidate is: /home/eliasz/wccl/libwccl/values/strset.h:34:7: note: Wccl::StrSet& Wccl::StrSet::operator=(Wccl::StrSet&) /home/eliasz/wccl/libwccl/values/strset.h:34:7: note: no known conversion for argument 1 from ‘Wccl::StrSet’ to ‘Wccl::StrSet&’ make[2]: *** [libwccl/CMakeFiles/wccl.dir/variables.cpp.o] Error 1 make[1]: *** [libwccl/CMakeFiles/wccl.dir/all] Error
variables.cpp:
namespace { struct resethelper { const Variables& v; resethelper(Variables& v): v(v) {} template<typename T> void operator()(const boost::mpl::always<T>&) { typedef std::pair< std::string, boost::shared_ptr<T> > v_t; foreach (const v_t& a, v.get_all<T>()) { *a.second = T(); } } }; } /* end anon ns */
Referenced from:
void Variables::reset_values() { typedef boost::mpl::pop_front< types >::type concrete; boost::mpl::for_each<concrete, boost::mpl::always<boost::mpl::_1> >( resethelper(*this)); }
#4 Updated by Tomasz Śniatowski over 11 years ago
jeszcze gcc i boost version plz
#5 Updated by Adam Radziszewski over 11 years ago
To wszystko siedzi głęboko w VM-ce, więc dopiero teraz wydobyłem:
gcc/g++ 6.4.1 (z paczki Ubu 11.10 64)
Boost: 1.48 (ze źródeł)
#6 Updated by Tomasz Śniatowski over 11 years ago
hm, a daloby sie w ogole zebys mi wystawil ssh do tej VMki? :P
#7 Updated by Tomasz Śniatowski over 11 years ago
- Status changed from Nowy to Rozwiązany
- Assignee changed from Adam Radziszewski to Tomasz Śniatowski
- % Done changed from 0 to 100
Bugoficzer w booscie, https://svn.boost.org/trac/boost/ticket/6167
Workaround u nas w 10bc936c99d58d794c5aac31f7de5dea4c1093a4 -- dopisany recznie StrSet& op=(const StrSet&); bo z uwagi na cuda w booscie zwiazane z unordered_* i boost::move, kompilator generowal StrSet& op=(StrSet&) (bez consta), co się wywalało. Problem może się powtórzyć w przypadku innych klas zawierajacych jakies boostowe wynalazki, trwalszym workaroundem byloby doklepanie do opcji kopilacji --std=c++0x / --std=c++11 :P
BTW, zrobilem chmod +x na hooku post-update w repo wccl, bo sie nie aktualizowalo to co bylo widac przez http, mozecie chciec to powlaczac w pozostalych.