#9293 closed Bugs (wontfix)
multi_index_container iterator needs base object size
Reported by: | anonymous | Owned by: | Joaquín M López Muñoz |
---|---|---|---|
Milestone: | To Be Determined | Component: | multi_index |
Version: | Boost 1.46.0 | Severity: | Problem |
Keywords: | multi_index_set | Cc: |
Description
The reason this is a bug is because I cannot define 2 classes A&B that will be stored in sequenced containers, and have A&B each hold an iterator to the other's container.
For example, this works:
struct A; struct B { std::list<A>::iterator a_it; }; struct A { std::list<B>::iterator b_it; };
However, if I want to replace both lists with sequenced multi_index_containers, I can no longer compile it.
The problem is that the iterator to a multi_index_container somehow calls sizeof on the stored class, so the forward declaration is not enough to compile.
Attachments (1)
Change History (5)
by , 9 years ago
comment:1 by , 9 years ago
I don't have the latest boost installed. If you do, please compile the attached file and let me know if it works. For me, g++ -std=c++0x -c test.c
fails, but it works with -D USE_LIST
.
comment:2 by , 9 years ago
Resolution: | → wontfix |
---|---|
Status: | new → closed |
Type: | Bugs → Feature Requests |
Hi,
The reason your example fails to compile is that multi_index_container
does not work on so-called incomplete types, i.e. it needs to know the size of the element type at instantiation time. This is not a bug per se, although the ability to work with incomplete types is of course a desireable one.
Unfortunately I don't expect adding this capability any time soon as it needs some heavy refactoring I don't have currently the time for. Maybe you can replace your code with
struct A; struct B { const A* a_p; }; struct A { const B* b_p; };
and use iterator_to
to retrieve an iterator from a pointer when needed:
http://www.boost.org/libs/multi_index/doc/tutorial/indices.html#iterator_to
Let me know if that works for you.
comment:3 by , 9 years ago
Type: | Feature Requests → Bugs |
---|
I understand, I didn't know about the completeness requirement, I thought I could just blindly replace std::list.
Now I wonder, how is iterator_to implemented? Is there a hidden index, indexed by address?
comment:4 by , 9 years ago
I understand, I didn't know about the completeness requirement, I thought I could just blindly replace std::list.
In fact, if my memory serves me well there's no standard requirement that std::list
can be instantiated with incomplete types, you happen to be using an stdlib implementation providing this nice-to-have feature.
Now I wonder, how is iterator_to implemented? Is there a hidden index, indexed by address?
There's no black magic here. iterator_to
is used in the following context:
iterator it=c.iterator_to(*p);
So, you are providing the function with the node and the container it belongs to, this is all the info required to construct the iterator (not in a general case, but it happens to be so in Boost.MultiIndex.)
use case demonstration