2015-12-21 8 views
1

Я хочу иметь переменную std::unordered_map<std::string,MyClass*()>. Но - когда я пытаюсь инстанцировании что, я получаю сообщение об ошибке, глубоко внутри, который является по существу:Я попадаю в stl :: pair issue 2051, если я использую указатель функции как значение a pair?

/usr/include/c++/4.9/bits/stl_pair.h(102): error: a function type is not allowed here 
      detected during: 
      instantiation of class "std::pair<_T1, _T2> [with _T1=const std::string, _T2=MyClass *()]" 

Я уверен, что это не из-за ошибки в шахте. Я просмотрел сайт и заметил ссылку на LWG issue 2051 , делая std::pair слишком ограничительным. Неужели это то, что я вижу? Если да, то что мне делать, чтобы обойти это? Использовать класс обертки нет данных и operator() возможно? std::function?

+1

чтобы быть ясно, вы хотите отобразить из строки на указатель к функции фиксации-нет-аргументов-и-возвращающ-указатель на MyClass? Если это так, то измените второй аргумент на 'MyClass * (*)()' –

+1

. Я не вижу, как связана проблема 2051. –

+0

Я не думаю, что контейнер функций легален - [container.requirements.general] говорит который содержит объекты * магазина *. Таким образом, чтобы реализовать контейнер функций, на самом деле вам нужно иметь контейнер указателей функций (или класс, который обертывает указатель на функцию, например, «std :: function» или объекты-объекты). –

ответ

4

Если вы хотите иметь карту из строки в MyClass указателя, вы должны объявить:

std::unordered_map<std::string,MyClass*> x; 

Но если вы хотите иметь карту для функции указателя в к функции, возвращающей указатель на MyClass вы могли бы рассмотреть:

std::unordered_map<std::string,MyClass*(*)()> x; 
+0

WIll проверьте, была ли эта проблема, или если я просто неверно процитировал определение (есть некоторые задействованные 'using =', которые я удалил). – einpoklum

+0

Yup, вот и все. – einpoklum

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

  • Нет связанных вопросов^_^