2010-06-09 2 views
0

Когда я пытаюсь скомпилировать это:Что вызывает эту ошибку компиляции, связанную с шаблоном?

#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.

Я задаюсь вопросом, может ли это быть изменение этой проблемы: Why doesn't this C++ template code compile? Но мой вывод ошибок только частично похожи, и мой код работает в VS2008, я не уверен.

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

ответ

9

typename Вам нужно:

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

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

+0

Fantastic! Вы не только решили мою проблему, но и сделали мне понять, что принципиально важно в том, как обрабатываются шаблоны компилятором. Спасибо, кучка. – Setien

2

Также упомянуть, 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 **' 
+0

Спасибо. Я буду помнить об этом для будущих ошибок компиляции шаблона (переход на более новые версии GCC, которые есть). – Setien

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