2009-01-06 107 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; 

這將至少解決您的第二個錯誤。我無法重現你的第一個錯誤,但我懷疑這也能解決這個問題。