Я предлагаю не использовать BOOST_FOREACH в этом случае, поскольку читателю кода может быть несколько сложнее, что происходит под капотом.Вы можете переписать функцию обновления, используя простые итераторы:
void StaticSystem::update()
{
for (stats::iterator it = mStatsData.begin(); it != mStatsData.end(); ++it)
{
string data = lexical_cast<string>(*it->second);
cout << data << "\n";
// Usage of 'data' value
}
}
Однако, это само по себе не заставит ваш код работать.Есть некоторые другие ошибки / плохой дизайн:1) Не используйте boost :: any, если в этом нет полной необходимости - это тяжелый шаблонный класс, который замедляет компиляцию и не дает подсказки, какие фактические типы хранятся внутри.Лучшим подходом было бы создание классов EarthActivity
и SunActivity
, которые оба были бы производными от общего класса Activity
, а затем использовали бы Activity*
вместо boost::any*
в качестве параметра карты.Если возвращаемые значения являются только примитивными (например, float
и int
в вашем примере), почему Солнце возвращает float
и Землю int
?Вы должны использовать float
/ double
для обоих.2) Вы обращаетесь к члену класса StatisticSystem
внутри дорожки статического метода, это недопустимо и не будет компилироваться.Если вы пытаетесь реализовать шаблон Singleton, существует множество учебных пособий о том, как сделать его правильно, например, этот: http://www.yolinux.com/TUTORIALS/C++Singleton.html3) Вам не хватает возвращаемых типов функций.Если вы хотите, чтобы функции ничего не возвращали, укажите void
в качестве типа возврата:
void functionReturningNothing() { /* ... */ }