2016-02-27 3 views
-2

Я пытаюсь выполнить эту программу с помощью смарт-указатели:Интеллектуальные указатели и карты в C++

//File user.h 
#include <list> 
#include <iostream> 
#include <string> 
#include <fstream> 
#include <sstream> 
#include <memory> 
#include <map> 

using namespace std; 

class User { 
    string name; 
    int id; 
public: 
    User(const string& name, int id) : name(name), id(id) {} 
    int getID() const {return id;} 
    ~User(){} 
}; 

//File main.c 
#include "user.h" 
using namespace std; 
typedef std::shared_ptr<User> UserPtr; 
typedef map<string, UserPtr> Dict; 

int main() 
{ 
    Dict dict; 
    dict = new User("Adams", 666); 
    auto it = dict.find("Adams"); 

    if (it == dict.end()) 
     cout << "not found!" << endl; 

    else 
     cout << "id3: " << it->second->getID() << endl; 

    return 0; 
} 

Я испытал это раньше с сырыми указателями (*), и это работает. Тем не менее, при использовании интеллектуальных указателей я получаю следующие ошибки:

main.cpp: In function ‘int main()’: 
main.cpp:15:10: error: no match for ‘operator=’ (operand types are ‘Dict {aka std::map<std::basic_string<char>, std::shared_ptr<User> >}’ and ‘User*’) 
    dict = new User("Adams", 666); 
     ^
main.cpp:15:10: note: candidates are: 
In file included from /usr/include/c++/4.8/map:61:0, 
       from user.h:10, 
       from main.cpp:3: 
/usr/include/c++/4.8/bits/stl_map.h:264:7: note: std::map<_Key, _Tp, _Compare, _Alloc>& std::map<_Key, _Tp, _Compare, _Alloc>::operator=(const std::map<_Key, _Tp, _Compare, _Alloc>&) [with _Key = std::basic_string<char>; _Tp = std::shared_ptr<User>; _Compare = std::less<std::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::shared_ptr<User> > >] 
     operator=(const map& __x) 
    ^
/usr/include/c++/4.8/bits/stl_map.h:264:7: note: no known conversion for argument 1 from ‘User*’ to ‘const std::map<std::basic_string<char>, std::shared_ptr<User> >&’ 
/usr/include/c++/4.8/bits/stl_map.h:279:7: note: std::map<_Key, _Tp, _Compare, _Alloc>& std::map<_Key, _Tp, _Compare, _Alloc>::operator=(std::map<_Key, _Tp, _Compare, _Alloc>&&) [with _Key = std::basic_string<char>; _Tp = std::shared_ptr<User>; _Compare = std::less<std::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::shared_ptr<User> > >] 
     operator=(map&& __x) 
    ^
/usr/include/c++/4.8/bits/stl_map.h:279:7: note: no known conversion for argument 1 from ‘User*’ to ‘std::map<std::basic_string<char>, std::shared_ptr<User> >&&’ 
/usr/include/c++/4.8/bits/stl_map.h:300:7: note: std::map<_Key, _Tp, _Compare, _Alloc>& std::map<_Key, _Tp, _Compare, _Alloc>::operator=(std::initializer_list<std::pair<const _Key, _Tp> >) [with _Key = std::basic_string<char>; _Tp = std::shared_ptr<User>; _Compare = std::less<std::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::shared_ptr<User> > >] 
     operator=(initializer_list<value_type> __l) 
    ^
/usr/include/c++/4.8/bits/stl_map.h:300:7: note: no known conversion for argument 1 from ‘User*’ to ‘std::initializer_list<std::pair<const std::basic_string<char>, std::shared_ptr<User> > >’ 

Является ли умный указатель ошибочно объявленным?

+2

Вы не добавлять элементы на карту правильно. 'map [key] = значение;' – Galik

ответ

4

Dict является std :: map, и вы пытаетесь назначить указатель на пользователя, который является неправильным.

Что вам нужно

dict["Adams"] = std::make_shared<User>("Adams", 666); 
Смежные вопросы