使用模板帮助纠正源代码

时间:2009-01-06 19:30:02

标签: c++ templates stl

我尝试编译发布的示例(C++ Service Providers),但未能使用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>();
}

2 个答案:

答案 0 :(得分:2)

要编译此代码,请执行以下操作:

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

应该是:

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

答案 1 :(得分:1)

将第33行的typedef更改为:

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

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