2013-03-12 1 views
0

У меня есть следующий код:ошибка C2101: '&' на постоянной

std::map<size_t,Cell&> m_cellMap; 

, когда сотовый определяется следующим образом:

class Cell 
    { 
     public: 
     Cell(int x = 0,int y = 0) : m_x(x),m_y(y) { } 
     private: 
     int m_x; 
     int m_y; 
     /// class members and methods 
    }; 

Я не могу компилировать код ниже:

Cell c; 
m_cellMap[0] = c; 

Получение ошибки: error C2101: '&' on constant Что не так? Как это можно исправить?

Благодаря

+0

Ссылки по умолчанию не могут быть конструктивными или назначаемыми по умолчанию. Эти операции необходимы для параметра mapped_type в операции, которую вы показываете. – juanchopanza

ответ

8

Это не возможно держать ссылки в стандартных контейнерах, использовать указатели вместо:

std::map<size_t,Cell*> m_cellMap; 

Cell c; 
m_cellMap[0] = &c; 
+2

Jinx! :-) Есть ли способ увидеть наши временные метки ближе, чем ко второму? – Yakk

+0

@Yakk: Ничего себе! ... Я не знаю, как лучше видеть временные метки, но когда я приказываю «старейшими», вы оказываетесь выше меня. – Mankarse

+1

Будьте осторожны, что 'c' не выходит за рамки. В этом случае указатель в 'm_cellMap' будет указывать на мусор. –

6

Вы не можете сделать std::map в ссылки. Ссылка не имеет свойств, которые должны иметь значения, которые должны иметь карты std::map.

Попробуйте создать std::map<size_t, Cell*> и делать m_cellMap[0] = &c;

0

Если вы не хотите иметь дело с сырыми указателями (и вы действительно не хотите), то вместо этого вы можете использовать std::reference_wrapper.

std::map<size_t,std::reference_wrapper<Cell>> m_cellMap; 

Если вы сделаете это, то вам необходимо, чтобы избежать использования оператора [].

Для размещения на карте необходимо сделать следующее.

m_cellMap.insert(std::make_pair(0, c)); 

Если вы используете указатели вместо ссылки, то вам нужно управлять временем жизни Cell объекта, который вы создаете.

+0

Я не вижу никакой разницы между этим и необработанным указателем. Оба подразумевают, что что-то еще управляет временем жизни ссылочных объектов. – Mankarse

+0

Разница заключается в том, что с необработанным указателем вы несете ответственность за удаление указателя, когда вы закончите с ним. Используя 'reference_wrapper', объект будет существовать до тех пор, пока он вам понадобится, и будет автоматически очищен. –

+1

Но я думаю, что это неверно с reference_wrapper. Я сбиваю с толку, что с функцией shared_ptr. С reference_wrapper время жизни объекта все еще зависит от области, в которой был создан объект. –

Смежные вопросы