Как использовать контейнер STL для хранения шаблонов на основе shared_ptr?
Я хочу создать контейнер для хранения 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;
}
}
Теперь у меня есть несколько вопросов. Компилятор не позволяет мне использовать DataPtr::type при определении mapData, сообщение об ошибке "ожидается тип, получено" dataPtr::type ". Если я уронить тип и использовать
template <class T>
struct mapData {
typedef typename std::map<std::string, DataPtr<T> > type;
};
Тогда "data[str] = sth" не проходит ("нет соответствия для operator=").
Какой должен быть правильный путь?
Большое спасибо.
1 ответ
Решение
Вы сместили позиционирование typename
ключевое слово:
typedef std::map<std::string, typename DataPtr<T>::type > type;
// ^^^^^^^^