我想构造一个容器来保存基于模板的shared_ptrs。例如,我有:

template <class T>
class Data
{
    ....
};

template <class T>
struct DataPtr {
    typedef boost::shared_ptr<Data<T> > type;
};

template <class T>
struct mapData {
    typedef typename std::map<std::string, DataPtr<T>::type > type;
};

mapData<int>::type data;
void func(const std::string& str, DataPtr<int>::type& sth)
{
    if (sth)
    {
        data[str] = sth;
    }
}

现在我有几个问题。定义mapData时,编译器不允许我使用DataPtr::type,错误消息是“预期类型,得到了'dataPtr::type”。如果我放下类型并使用
template <class T>
struct mapData {
    typedef typename std::map<std::string, DataPtr<T> > type;
};

然后,“data [str] = sth”不通过(“与“operator =”不匹配”)。

正确的方法应该是什么?

非常感谢。

最佳答案

您已将typename关键字的位置放错了位置:

typedef std::map<std::string, typename DataPtr<T>::type > type;
//                            ^^^^^^^^

10-06 13:50