导致此模板相关编译错误的原因是什么?

时间:2010-06-09 20:37:43

标签: c++ templates gcc

当我尝试编译时:

#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

我在Mac OS X上使用GCC 4.2.1。 它适用于VS2008。

我想知道这可能是这个问题的变种: Why doesn't this C++ template code compile? 但由于我的错误输出只是部分相似,而我的代码在VS2008中工作,我不确定。

有人能说清楚我做错了吗?

2 个答案:

答案 0 :(得分:9)

您需要typename

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

由于ZObjectMap的类型取决于模板参数,编译器不知道ZObjectMap::const_iterator是什么(它可能是成员变量)。您需要使用typename通知编译器假设它将是某种类型。

答案 1 :(得分: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 **'