2009-01-06 8 views
1

J'ai essayé de compiler l'exemple affiché (C++ Service Providers) et échoué à VS8 VC9. J'ai peu d'expérience avec le template.
Des suggestions?
Réservoirs.Aide à corriger le code source, avec le modèle

Ce sont les erreurs:
dictionarystl.cpp (40): erreur C2663: 'std :: _ Arbre < _Traits> :: find': 2 ont aucune conversion surcharge juridique pour 'ce' pointeur
dictionarystl.cpp (48): erreur C2679: binaire '[': aucun opérateur trouvé qui prend un opérande à droite de type 'const type_info * __ w64' (ou il n'y a pas de conversion acceptable)

#include <typeinfo> 
#include <map> 
#include <string> 
using namespace std; 

class SomeClass 
{ 
public: 
    virtual ~SomeClass() {} // virtual function to get a v-table 
}; 

struct type_info_less 
{ 
    bool operator() (const std::type_info* lhs, const std::type_info* rhs) const 
    { 
     return lhs->before(*rhs) != 0; 
    } 
}; 

class TypeMap 
{ 
    typedef map <type_info *, void *, type_info_less> TypenameToObject; 
    TypenameToObject ObjectMap; 

public: 
    template <typename T> 
    T *Get() const 
    { 
     TypenameToObject::const_iterator iType = ObjectMap.find(&typeid(T)); 
     if (iType == ObjectMap.end()) 
      return NULL; 
     return reinterpret_cast<T *>(iType->second); 
    } 
    template <typename T> 
    void Set(T *value) 
    { 
     ObjectMap[&typeid(T)] = reinterpret_cast<void *>(value); 
    } 
}; 

int main() 
{ 
    TypeMap Services; 
    Services.Set<SomeClass>(new SomeClass()); 
    SomeClass *x = Services.Get<SomeClass>(); 
} 

Répondre

2

pour ce code pour compiler , la ligne suivante:

typedef map<type_info *, void *, type_info_less> TypenameToObject; 

devrait être:

typedef map<const type_info *, void *, type_info_less> TypenameToObject; 
1

Modifier la typedef en ligne 33 à lire:

typedef map <const type_info *, void *, type_info_less> TypenameToObject; 

Cela va au moins fixer votre deuxième erreur. Je n'ai pas pu reproduire votre première erreur, mais je suspecte que cela corrigera cela aussi.