Bonjour,

J'ai dans un header un code semblable à celui-ci.
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
#ifdef USE_UNORDERED
#include "boost/unordered_set.hpp"
#else
#include <set>
#endif
 
 
class MyClass
{
#ifdef USE_UNORDERED
	typedef boost::unordered_set<SomeClass, SomeClass_hash, SomeClass_equal> MySet;
#else
	typedef std::set<StrEnum> MySet;
#endif
	MySet f_set;
 
public:
	MyClass():
		f_set() {} // <-- ici f_set est vu comme un std::set<>
	template<typename Tr>
	void Init(Tr tr)
	{
		f_set.clear();// <-- ici, comme un boost::unordered_set<>
		...
	}
};
Quelque part dans un header de base la macro USE_UNORDERED est définie. En principe donc le type MySet est de type boost::unordered_set<>.
Ailleurs dans le code j'ai une classe qui instancie MyClass, mais curieusement elle instancie le membre f_set comme étant un std::set<> et non pas comme un boost::unordered_set<>.
Puis, plus loin dans le code, lorsque l'instance en question éxecute sa méthode MyClass::Init(tr) f_set est de type boost::unordered_set<>. Bien sûr, là ça plante.
En bref, une même instance est tantôt d'un type tantôt de l'autre, comme si la macro USE_UNORDERED n'était pas "vue" à tout moment par le (pré-)compilateur. Et pourtant l'instantiation et le code se trouvent dans un même cpp, tous les headers étant déclarés au début.

Je n'arrive pas à déterminer ou est l'erreur dans mon code (l'ordre de déclaration des headers par exemple), si erreur il y a...
J'utilise visual studio 2005 et 2010, la même erreur se produisant avec les deux compilateurs. Je n'utilise pas la précompilation des entêtes.
Merci de m'éclairer.