[Dune-devel] [GSoC]Updates and problems
Oliver Sander
oliver.sander at tu-dresden.de
Thu Jul 14 10:07:18 CEST 2016
Hi Xinyun,
[please keep the discussions on the list.]
I think your BSplineLeafIterator class needs to hold a (shared) pointer so the entity it points to,
in addition to the directIndex. Then what 'dereference' returns is not a temporary anymore.
Cheers,
Oliver
On 14.07.2016 00:28, Xinyun wrote:
> Hey Oliver,
>
> In the past few days I tried to make the BSplineLeafIterator work using the Barton-Nackman trick. You can check here <http://gsoc2016xinyun.blogspot.de/2016/07/make-b-spline-grid-iterators-work.html> for more details about what I intended to do. But I encountered a specific programming problem which even hindered me to compile the code. I have spent some time to play around but still couldn't make it through. So I think it's better to ask for your help. As the code still contains errors, I didn't upload it to gitlab. I will try to explain with some code snippets here.
>
> I made my BSplineGridLeafIterator class a subclass of the the ForwardIteratorFacade class. The dereference overloading of the base class requires a reference return.
>
> "iteratorfacades.hh"
> Reference operator*() const
> {
> return static_cast<DerivedType const*>(this)->dereference();
> }
>
> But in my BSpline iterator implementation, I created a BSpline entity locally which makes return by reference invalid.
>
> "bsplinegridleafiterator.hh"
> public:
> BSplineEntity& dereference() const
> {
> return BSplineGridView_-> template getEntity<codim>(directIndex_);
> }
> private:
> BSplineGridView* BSplineGridView_;
> unsigned int directIndex_;
>
> "bsplinegridview.hh"
> template<int codim>
> typename Codim<codim>::Entity getEntity(unsigned int directIndex)
> {
> //return BSplineGridEntity<codim, BSplineGridView>(*this, directIndex);
> return *std::make_shared<BSplineGridEntity<codim, BSplineGridView>>(*this, directIndex);
> }
>
> The error message I got is
> error: invalid initialization of non-const reference of type ‘Dune::IGA::BSplineGridEntity<0, Dune::IGA::BSplineLeafGridView<2, 3> >&’ from an rvalue of type ‘Dune::IGA::BSplineLeafGridView<2, 3>::Codim<0>::Entity {aka Dune::IGA::BSplineGridEntity<0, Dune::IGA::BSplineLeafGridView<2, 3> >}’
> return BSplineGridView_-> template getEntity<codim>(directIndex_);
>
> I hope the code above is able to explain. Otherwise, I can also provide more context.
> I'm not sure if I identified the problem correctly. If yes, I could not see a good solution to it. My only solution is to make a list of entities as class member of BSplineGridView so that they have a larger scope.
>
> Thanks,
> Xinyun
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: OpenPGP digital signature
URL: <https://lists.dune-project.org/pipermail/dune-devel/attachments/20160714/00906f44/attachment.sig>
More information about the Dune-devel
mailing list