2015-03-31 23 views
8

Ho tentato di memorizzare un oggetto foo in un std::reference_wrapper, ma alla fine ho riscontrato un errore del compilatore che non capisco.Memorizzazione di riferimenti in una mappa

#include <functional> 
#include <map> 

struct foo 
{ 
}; 

int main() 
{ 
    std::map< int, std::reference_wrapper<foo> > my_map; 
    foo a; 
    my_map[ 0 ] = std::ref(a); 
} 

L'errore del compilatore è abbastanza lungo, ma si riduce a questo:

error: no matching function for call to ‘std::reference_wrapper<foo>::reference_wrapper()’ 

Che cosa sto facendo di sbagliato?

+0

std :: reference_wrapper non ha alcun costruttore predefinito –

risposta

6

std::reference_wrapper non è predefinito-constructible (altrimenti sarebbe un puntatore).

my_map[0] 

crea, se 0 non è già una chiave nella mappa, un nuovo oggetto di tipo mappato, e per questo il tipo di tracciato ha bisogno di un costruttore di default. Se il tipo di tracciato non è default-costruibile, utilizzare insert():

my_map.insert(std::make_pair(0, std::ref(a))); 

o emplace():

my_map.emplace(0, std::ref(a));