Как использовать контейнер 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;
//                            ^^^^^^^^
Другие вопросы по тегам