Передать контейнер умного указателя в качестве аргумента в C ++ - PullRequest
0 голосов
/ 25 ноября 2010

У меня есть функция, как показано ниже

void functionA(unordered_map<string, classA*>* arg1);

Мне нужно пройти в

unordered_map<string, shared_ptr<classA>>

Как я могу передать контейнер с shared_ptr в функцию, которая принимает контейнер необработанного указателя? Я использую C ++ 0x здесь.

Спасибо

Ответы [ 3 ]

2 голосов
/ 25 ноября 2010

Typewise unordered_map<string, shared_ptr<classA>> и unordered_map<string, classA*> являются несвязанными типами.

Таким образом, вы не можете напрямую передать тот, где ожидается другой.

Вы можете:

  • измените подпись вашей функции или

  • скопируйте данные в объект ожидаемого типа.

Byвместо аргумента-указателя рассмотрим ссылочный аргумент.

Кроме того, рассмотрите возможность добавления const везде, где это возможно - это обычно помогает сделать код более простым для понимания, потому что тогда у вас есть гарантия отсутствия изменений.

Приветствия и hth.,

0 голосов
/ 25 ноября 2010

Поскольку вы спросили, вот как шаблон может выглядеть для этой функции:

template <typename MAP_TYPE>
void functionA(const MAP_TYPE& arg1)
{
    // Use arg1 here
}

Вы можете использовать указатель и / или сделать его неконстантным, если необходимо.Пока передаваемая карта использует совместимый тип ключа и некоторый указатель на правильный тип в качестве значения, она должна компилироваться и запускаться.Является ли указатель собственным или умным указателем, вероятно, не будет иметь значения, в зависимости от того, как вы использовали его в реализации своей функции.

0 голосов
/ 25 ноября 2010

Вам нужно либо изменить функцию A, либо создать временную карту unordered_map того типа, который он хочет получить.

...