Что вызывает эту связанную с шаблоном ошибку компиляции? - PullRequest
0 голосов
/ 10 июня 2010

Когда я пытаюсь скомпилировать это:

#include <map>
#include <string>

template <class T>
class ZUniquePool
{               
        typedef std::map< int, T* > ZObjectMap;
        ZObjectMap      m_objects;
public:
    T * Get( int id )
    {
        ZObjectMap::const_iterator it = m_objects.find( id );
        if( it == m_objects.end() )
        {
            T * p = new T;
            m_objects[ id ] = p;
            return p;
        }
        return m_objects[ id ];
    }
};

int main( int argc, char * args )
{
    ZUniquePool< std::string > pool;
    return 0;
}

я получаю это:

main.cpp: In member function ‘T* ZUniquePool<T>::Get(int)’:
main.cpp:12: error: expected `;' before ‘it’
main.cpp:13: error: ‘it’ was not declared in this scope

Я использую GCC 4.2.1 на Mac OS X. Он работает в VS2008.

Мне интересно, может ли это быть вариацией этой проблемы: Почему этот код шаблона C ++ не компилируется? Но поскольку мой вывод ошибок только частично похож, и мой код работаетв VS2008 я не уверен.

Может кто-нибудь пролить свет на то, что я делаю неправильно?

Ответы [ 2 ]

9 голосов
/ 10 июня 2010

Вам нужно typename:

typename ZObjectMap::const_iterator it = m_objects.find( id )

Поскольку тип ZObjectMap зависит от параметра шаблона, компилятор понятия не имеет, что такое ZObjectMap::const_iterator (это может быть переменная-член). Вам нужно использовать typename, чтобы сообщить компилятору, что он будет какого-то типа.

2 голосов
/ 10 июня 2010

Также следует упомянуть, что GCC 4.5.0 дает следующий вывод, который поможет вам решить проблему:

main.cpp: In member function 'T* ZUniquePool<T>::Get(int)':
main.cpp:12:7: error: need 'typename' before 'ZUniquePool<T>::ZObjectMap:: const_iterator' because 'ZUniquePool<T>::ZObjectMap' is a dependent scope
main.cpp:12:34: error: expected ';' before 'it'
main.cpp:13:11: error: 'it' was not declared in this scope
main.cpp: At global scope:
main.cpp:23:5: warning: second argument of 'int main(int, char*)' should be 'char **'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...