gcc3可以编译通过的函数模板在gcc4下编译出错

sswv 2009-03-19 12:32:00
我的一个头文件中定义了这样一个函数模板:


#define SERIALIZE_LIST(VECTOR, CLASS_TYPE) SerializeList<CLASS_TYPE>(VECTOR, Serialize##CLASS_TYPE)

template<typename T>
char *SerializeList(vector<T> &objects, char *(*func)(T&), char *classname = NULL)
{
vector<string> *vstr = new vector<string>();
string *itemstr;
char *itemxml, *xmlret;

vector<T>::iterator iter;
for(iter = objects.begin(); iter != objects.end(); iter++)
{
......
}
......

return xmlret;
}


在VS2008(Windows)以及gcc 3.2.3(RedHat)下编译没有问题。
但在gcc4.1/4.3(Ubuntu)下编译报错:

In file included from XmlUtil_obf.cpp:7:
XmlUtil.h: In function ‘char* SerializeList(std::vector<T, std::allocator<_Tp1> >&, char* (*)(T&), char*)’:
XmlUtil.h:220: error: expected `;' before ‘iter’
XmlUtil.h:221: error: ‘iter’ was not declared in this scope

请问这是为什么?如何解决?谢谢!
(RedHat和Ubuntu下的XmlUtil.h完全一样,MD5为证。文件已经dos2unix,是\n换行的。)
...全文
224 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sswv 2009-03-19
  • 打赏
  • 举报
回复
谢谢各位!
  • 打赏
  • 举报
回复
晕,这种一换编译器就出问题的情况很麻烦。帮顶。
叶落寒山 2009-03-19
  • 打赏
  • 举报
回复
lz没有弄明白 typename是什么意思。在这里typename表示它所修饰的是一个类型,表示此处vector<T>::iterator
代表的是一个迭代器类型。而不是代表的是vector的一个变量iterator。

因为vector<T>::iterator 有歧义,既可以表示这是一个类型,也可以看成这是一个成员变量。为了区分,C++使用关键字
typename来进行修饰。

可以去看看 《STL源码剖析》,里面有这些内容。
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sswv 的回复:]

请问什么时候加上这个 typename 才是必要和正确的?原理是什么?哪本书对函数模板讲解详细?谢谢!

[/Quote]

在模板中,使用一个不确定类型的内置类型的时候.
xtting_8984313 2009-03-19
  • 打赏
  • 举报
回复
XmlUtil.h:220: error: expected `;' before ‘iter’
看到这句了吗,编译器把前边的iterator当作变量来解释了,要你加入;

这个问题看一下c++ templates,里面的解释更好。
sswv 2009-03-19
  • 打赏
  • 举报
回复
谢谢!加上typename的确就好了。
但我还想问一下,我在另一个函数模板中:

template<typename T>
vector<T> *UnserializeList(const char *xml, T *(*func)(const char *))
{
vector<string> *vstr = ListXmlToXmlVector(xml);
vector<T> *vret = new vector<T>();
......
return vret;
}


如果在 vector<T> *vret 之前加一个 typename ,gcc反而会报错:

XmlUtil.h: In function ‘std::vector<T, std::allocator<_CharT> >* UnserializeList(const char*, T* (*)(const char*))’:
XmlUtil.h:187: error: invalid declarator before ‘*’ token
XmlUtil.h:193: error: ‘vret’ was not declared in this scope

请问什么时候加上这个 typename 才是必要和正确的?原理是什么?哪本书对函数模板讲解详细?谢谢!
Jinhao 2009-03-19
  • 打赏
  • 举报
回复
ls正解
1900_in_bj 2009-03-19
  • 打赏
  • 举报
回复
vector<T>::iterator iter;
换成
typename vector<T>::iterator iter;
看看?

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧