当我尝试编译时:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
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
Run Code Online (Sandbox Code Playgroud)
我在Mac OS X上使用GCC 4.2.1.它适用于VS2008.
我想知道它是否可能是这个问题的一个变种: 为什么这个C++模板代码不能编译? 但由于我的错误输出只是部分相似,我的代码在VS2008中工作,我不确定.
谁能说清楚我做错了什么?
你需要typename:
typename ZObjectMap::const_iterator it = m_objects.find( id )
Run Code Online (Sandbox Code Playgroud)
由于类型ZObjectMap依赖于模板参数,因此编译器不知道ZObjectMap::const_iterator它是什么(它可以是成员变量).您需要使用typename通知编译器假设它将是某种类型.