Я попытался скомпилировать опубликованный пример (Поставщики услуг C++) и не смог выполнить VS8 VC9. У меня мало опыта работы с шаблоном.
Есть предложения?
Танки.
Это ошибки:
Dictionarystl.cpp (40): ошибка C2663: 'std :: _ Tree <_Traits> :: find': 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>();
}





Для компиляции этого кода требуется следующая строка:
typedef map<type_info *, void *, type_info_less> TypenameToObject;
должно быть:
typedef map<const type_info *, void *, type_info_less> TypenameToObject;
Измените typedef в строке 33 следующим образом:
typedef map <const type_info *, void *, type_info_less> TypenameToObject;
Это, по крайней мере, исправит вашу вторую ошибку. Мне не удалось воспроизвести вашу первую ошибку, но я подозреваю, что это тоже исправит.