Bonsoir,

suite à une discussion que j'ai vu sur comp.lang.c++.moderated (http://groups.google.com/group/comp....6d29b3b6?hl=en),
je me suis effectivement aperçu qu'utiliser un conteneur de T * permettait de casser la constance.

Un exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <list>
 
template<typename Node>
class Graph
{
	typedef std::list<std::pair<Node *, Node *> > Arcs;
 
public:
	void addArc(Node * first, Node * second) {_arcs.push_back(std::pair<Node *, Node *>(first, second));}
 
	Arcs const & getArcs() const {return _arcs;}
 
private:
	Arcs _arcs;
};
 
int main()
{
	typedef int Node;
 
	Node node0, node1;
	Graph<Node> graph;
 
	graph.addArc(&node0, &node1);
 
	Graph<Node> const & pg = graph;
 
	Node & node = *pg.getArcs().front().first; // Get a non const reference Node from a const graph
 
	node = 3; // Modify a node get from a const graph !!!
}
Je me demande si cette solution (qui semble corriger le problème) est correcte :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<typename Node>
class Graph
{
	typedef std::list<std::pair<Node *, Node *> > Arcs;
	typedef std::list<std::pair<Node const *, Node const *> > ArcsC;
 
public:
	void addArc(Node * first, Node * second) {_arcs.push_back(std::pair<Node *, Node *>(first, second));}
 
	ArcsC const & getArcs() const {return reinterpret_cast<ArcsC const &>(_arcs);}
 
private:
	Arcs _arcs;
};