1

我正在 Debian 6.0.6(使用 gcc 4.4.5)上构建一个大型项目,该项目最初是在 Microsoft VS(我认为是 2008 年)中构建的。

问题似乎是,当我将成员声明为 typedef typename std::set<T>::iterator iterator,然后使用此迭代器时,gcc 似乎将其解释为 (const T*)。

类中包含typename名称的部分:

template <class entityType>
class entityArray
{
    private:                 std::set<entityType>             m_array;
    public: typedef typename std::set<entityType>::iterator   iterator;
 ...
    public:
        entityType*     At( const char* name);
 ...
};

加上讨论所需的其他一些课程:

class entity
{
    private:
        entity*     m_parent;
        int         m_ncid;
        std::string     m_name;
    public:
             entity () { m_ncid = 0; m_parent = NULL;}
    virtual ~entity () {};
 ...
};

class attribute : public entity
{
    public:
                   attribute(){};
        virtual   ~attribute(){};
};

class var : public entity
{
    private:
        entityArray<attribute>      m_atts;
    public:
                 var(){}
        virtual ~var(){}
       ...
};

class dim : public entity
{
    public:
                 dim() {};
        virtual ~dim() {};
};

class group : public entity
{
    private:
        entityArray<var>    m_vars;
        entityArray<dim>    m_dims;
...
    public:
        dim*     DimAt( const char* dimname )  { return m_dims.At(dimname);}
};

现在 aniterator通过调用函数来初始化,该函数DimAt又调用At. 第一类中的At函数定义为:

template <class entityType>
entityType* entityArray<entityType>::At( const char* name )
{
    entityType  dummy;
    iterator    iter;
    entityType* ptr;

    ... define dummy ...

    iter = m_array.find( dummy );
    ptr  = (iter != m_array.end()) ? &(*iter) : NULL;
    return ptr;
}

编译上述产生 error: invalid conversion from const dim* to dim*.,参考&(*iter). 我意识到声明typename是必需的iterator,因为类型是一个依赖的限定名称,但我不明白为什么const *编译器会执行此替换 ()。如果您能提供任何帮助,我将不胜感激。谢谢!

4

1 回答 1

0

这与typename.

该标准允许std::set<T>::iteratorstd::set<T>::const_iterator是相同的类型,并且对于 GCC,类型是相同的。

原因是修改 a 的元素,std::set例如 by*iter = val可能会使集合元素的顺序无效,破坏集合的元素总是有序的不变量。通过使iterator类型成为常量迭代器而不是可变迭代器,就不可能更改元素,从而防止您破坏集合的顺序。

因此,对于 GCC 的实现,当您使用取消引用迭代器时,*iter您会得到 aconst entitType&并且当您使用它的地址时,&*iter您会得到 aconst entityType*

于 2012-10-02T23:02:28.333 回答