VC ++ ошибочно принимает ваш код & mdash; соответствующий компилятор должен выдать ошибку здесь.
map<StringID, T* (*)()>
использует T
, который является зависимым типом; следовательно, для доступа к типам внутри map<StringID, T* (*)()>
, таким как iterator
, вам необходимо использовать ключевое слово typename
для устранения неоднозначности вещей для компилятора:
typename map<StringID, T* (*)()>::iterator it = m_createFunctions.find(typeID);
Подробнее об этом см. В этом FAQ: Для чего используется ключевое слово typename
?
Обратите внимание, что если вы компилируете в режиме C ++ 11, вы можете вместо этого использовать следующее упрощение:
auto it = m_createFunctions.find(typeID);