2009-01-06 74 views
1

我试着编译发布的例子(C++ Service Providers)并且未能通过VS8 VC9。我几乎没有模板经验。
有什么建议吗?
坦克。帮助纠正源代码,用模板

这些都是错误的:
dictionarystl.cpp(40):错误C2663: '的std :: _树< _Traits> ::发现':2个重载有this指针
dictionarystl.cpp没有法律转换(48):错误C2679:二进制“[”:没有操作员发现这需要类型的右边的操作数“const的TYPE_INFO * __ W64”(或没有可接受的转化率)

#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>(); 
} 

回答

2

为使该代码编译,以下行:

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

应该是:

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

变化线33 typedef阅读:

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

这将至少解决您的第二个错误。我无法重现你的第一个错误,但我怀疑这也能解决这个问题。