Deux types pour une même instance
Bonjour,
J'ai dans un header un code semblable à celui-ci.
Code:
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.