2014-02-06 80 views
1

我想構建一個容器來容納基於模板的shared_ptrs。例如,我有:如何使用STL容器來保存基於模板的shared_ptr?

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; 
}; 

然後「數據[STR] =某事物」未通過(「無匹配關於‘操作符=’」)。

什麼應該是正確的方法?

非常感謝。

回答

1

你弄丟了typename關鍵字的定位:

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

是的,你是對的。非常感謝! – user3277762