Błąd #3811

Problem z kompilacją z Boostem 1.48

Added by Adam Radziszewski over 8 years ago. Updated over 8 years ago.

Status:RozwiązanyStart date:27 Feb 2012
Priority:NormalnyDue 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 8 years ago

Wklejta errora i odpowiedni kawalek kodu to moze zerkne ;)

#2 Updated by Adam Radziszewski over 8 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 8 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 8 years ago

jeszcze gcc i boost version plz

#5 Updated by Adam Radziszewski over 8 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 8 years ago

hm, a daloby sie w ogole zebys mi wystawil ssh do tej VMki? :P

#7 Updated by Tomasz Śniatowski over 8 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.

Also available in: Atom PDF