我正在 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 *
编译器会执行此替换 ()。如果您能提供任何帮助,我将不胜感激。谢谢!