Clang 3.0 C ++ std :: map <> :: ошибка компиляции итератора - PullRequest
1 голос
/ 02 февраля 2012

У меня есть этот код:

template<typename T>
T* Factory<T>::GetObject(const char* type)
{
    StringID typeID(type);
    map<StringID, T* (*)()>::iterator it = m_createFunctions.find(typeID);
    return it->second();
}

Он прекрасно компилируется в Visual Studio 2010 и 2008, но не компилируется в Clang 3.0 (Xcode). Я думаю, что он хорошо скомпилирован на GCC, но я не уверен, что он был в той же форме, что и сейчас. Ошибка "; ожидается после выражения" находится в этой строке:

map<StringID, T* (*)()>::iterator it = m_createFunctions.find(typeID);

Знаешь почему?

Ответы [ 2 ]

4 голосов
/ 02 февраля 2012

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);
0 голосов
/ 15 февраля 2012

Скорее всего, у вас также будут ошибки в GCC.«Typename» необходимо в таких случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...