一个C++模板的问题,VC6.0通过, GCC不能通过!!
2007-12-13 19:45
756 查看
http://bbs.chinaunix.net/viewthread.php?tid=720257&extra=&page=1
template<class T>
class CCommList
{
public:
CCommList();
virtual ~CCommList();
void Clear();
private:
std::list<T*> infolist;
};
template<class T>
CCommList<T>::CCommList()
{
}
template<class T>
CCommList<T>::~CCommList()
{
}
template<class T>
void CCommList<T>::Clear()
{
list<T*>::iterator info_iter = infolist.begin();
for (; info_iter!=infolist.end(); info_iter++)
{
delete &*info_iter;
}
infolist.clear();
}
int main()
{
return (0);
}
//====================================================
Compiling source file(s)...
Main.cpp
Main.cpp: In member function `void CCommList<T>::Clear()':
Main.cpp:128: error: expected `;' before "info_iter"
Main.cpp:129: error: `info_iter' undeclared (first use this function)
Main.cpp:129: error: (Each undeclared identifier is reported only once for each function it appears in.)
TTemplate.exe - 3 error(s), 0 warning(s)
//====================================================
MinGW developer studio (GCC3.4.2) 请教各位高手,是哪出了问题..谢谢!!
在VC++6.0下相同代码编译没有显示错误!!
估计是没有加#include <list>,以及名字空间的修饰,我把你的代码改了一改就可以通过了
[Copy to clipboard] [ - ]
CODE:
#include <iostream>
#include <list>
template<class T>
class CCommList
{
public:
CCommList();
virtual ~CCommList();
void Clear();
private:
std::list<T*> infolist;
};
template<class T>
CCommList<T>::CCommList()
{
}
template<class T>
CCommList<T>::~CCommList()
{
}
template<class T>
void CCommList<T>::Clear()
{
std::list<T*>::iterator info_iter = infolist.begin();
for (; info_iter!=infolist.end(); info_iter++)
{
delete &*info_iter;
}
infolist.clear();
}
int main()
{
return (0);
}
谢谢你的回复!我加了包含文件和名称空间,只是忘了贴上来.请问你用的什么编译器?
》std::list<T*>::iterator info_iter = infolist.begin();
》typename std::list<T*>::iterator info_iter = infolist.begin();
我看了下书,好像是在模板定义中,
编译器不知道list<T*>::iterator是代表一个类型
还是代表list<T*>类中的一个成员,叫做iterator。
恩,我明白了,我原本不用加typename的时候是在非模板的情况下面没有出过警告,比如:
[Copy to clipboard] [ - ]
CODE:
#include <iostream>
#include <list>
int main()
{
int array[9] = {0};
std::list<int> list(array, array + 9);
std::list<int>::iterator iter1 = list.begin(), iter2 = list.end();
for (; iter1 != iter2; iter1++)
{
std::cout << *iter1 << std::endl;
}
return 0;
}
我把typename在模板中的用法看了一看,是这样的:
当我这样使用:
[Copy to clipboard] [ - ]
CODE:
#include <iostream>
#include <list>
int main()
{
int array[9] = {0};
std::list<int> list(array, array + 9);
std::list<int>::iterator iter1 = list.begin(), iter2 = list.end();
for (; iter1 != iter2; iter1++)
{
std::cout << *iter1 << std::endl;
}
return 0;
}
这个时候,模板已经被实例化为int类型的,这个实力中有一个类型iterator.OK,这个没有问题,没有警告直接通过.
但是,如果是这样写:
std::list<T>::iterator,编译器到实例化之前不知道具体实例化的哪个实例,假设有可能std::list<char>类型中正好有一个静态成员是iterator,那么这个就是错误的.
为了明确的告诉编译器iterator,是一个类型而不是成员的名字,我们需要在前面加上typename.
template<class T>
class CCommList
{
public:
CCommList();
virtual ~CCommList();
void Clear();
private:
std::list<T*> infolist;
};
template<class T>
CCommList<T>::CCommList()
{
}
template<class T>
CCommList<T>::~CCommList()
{
}
template<class T>
void CCommList<T>::Clear()
{
list<T*>::iterator info_iter = infolist.begin();
for (; info_iter!=infolist.end(); info_iter++)
{
delete &*info_iter;
}
infolist.clear();
}
int main()
{
return (0);
}
//====================================================
Compiling source file(s)...
Main.cpp
Main.cpp: In member function `void CCommList<T>::Clear()':
Main.cpp:128: error: expected `;' before "info_iter"
Main.cpp:129: error: `info_iter' undeclared (first use this function)
Main.cpp:129: error: (Each undeclared identifier is reported only once for each function it appears in.)
TTemplate.exe - 3 error(s), 0 warning(s)
//====================================================
MinGW developer studio (GCC3.4.2) 请教各位高手,是哪出了问题..谢谢!!
在VC++6.0下相同代码编译没有显示错误!!
估计是没有加#include <list>,以及名字空间的修饰,我把你的代码改了一改就可以通过了
[Copy to clipboard] [ - ]
CODE:
#include <iostream>
#include <list>
template<class T>
class CCommList
{
public:
CCommList();
virtual ~CCommList();
void Clear();
private:
std::list<T*> infolist;
};
template<class T>
CCommList<T>::CCommList()
{
}
template<class T>
CCommList<T>::~CCommList()
{
}
template<class T>
void CCommList<T>::Clear()
{
std::list<T*>::iterator info_iter = infolist.begin();
for (; info_iter!=infolist.end(); info_iter++)
{
delete &*info_iter;
}
infolist.clear();
}
int main()
{
return (0);
}
谢谢你的回复!我加了包含文件和名称空间,只是忘了贴上来.请问你用的什么编译器?
》std::list<T*>::iterator info_iter = infolist.begin();
》typename std::list<T*>::iterator info_iter = infolist.begin();
我看了下书,好像是在模板定义中,
编译器不知道list<T*>::iterator是代表一个类型
还是代表list<T*>类中的一个成员,叫做iterator。
恩,我明白了,我原本不用加typename的时候是在非模板的情况下面没有出过警告,比如:
[Copy to clipboard] [ - ]
CODE:
#include <iostream>
#include <list>
int main()
{
int array[9] = {0};
std::list<int> list(array, array + 9);
std::list<int>::iterator iter1 = list.begin(), iter2 = list.end();
for (; iter1 != iter2; iter1++)
{
std::cout << *iter1 << std::endl;
}
return 0;
}
我把typename在模板中的用法看了一看,是这样的:
当我这样使用:
[Copy to clipboard] [ - ]
CODE:
#include <iostream>
#include <list>
int main()
{
int array[9] = {0};
std::list<int> list(array, array + 9);
std::list<int>::iterator iter1 = list.begin(), iter2 = list.end();
for (; iter1 != iter2; iter1++)
{
std::cout << *iter1 << std::endl;
}
return 0;
}
这个时候,模板已经被实例化为int类型的,这个实力中有一个类型iterator.OK,这个没有问题,没有警告直接通过.
但是,如果是这样写:
std::list<T>::iterator,编译器到实例化之前不知道具体实例化的哪个实例,假设有可能std::list<char>类型中正好有一个静态成员是iterator,那么这个就是错误的.
为了明确的告诉编译器iterator,是一个类型而不是成员的名字,我们需要在前面加上typename.
相关文章推荐
- C++库研究笔记——使用函数模板还是类模板?+ 一个类型重复问题的两种解决方法
- 一个编译不能通过的问题的解决
- 写一个只能C编译通过,而C++不能编译通过的函数。
- Xcode 5 中引入 C++ 模板代码无法编译通过的问题解决
- 关于JSP不能通过浏览器直接访问,要通过servlet跳转,但一个jsp文件里面用<iframe>标签包含了另一个jsp的访问问题
- 今天通过修改Oracle 数据库解决的一个ERP不能打出验收单问题.
- Csdn论坛关于一个模板特化不能执行的问题的修改
- rsync命令----解决远程拷贝一个问题通过scp不能复制ln文件
- [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)
- 【C++】通过模板实现一个通用的冒泡排序
- 通过SessionID和用户名来保证同一个用户不能同时登录的问题
- GCC中标准库容器与模板嵌套使用问题(带模板迭代器不能识别)
- Debian 8.5 + GCC 5.4 + LLVM Clang 3.8.1 + Vim 8.0 配置YouCompleteMe 解决不能对C++代码补全的问题
- 一个纠结的c++动态创建二维数组不能用的问题
- C++递归问题之二——n皇后问题:以四、八皇后为例,给定n个皇后要求将它们放在一个n维矩阵中,任意两个皇后不能出现在同一行、列、主副对角线上,输出具体的摆放方式
- 今天遇到的一个IIS 下treeview不能显示的问题
- C++中用函数返回值初始类对象时的一个问题
- 用C++实现一个不能被继承的类
- 解决mysql中只能通过localhost访问不能通过ip访问的问题
- 问题: Mac外联硬盘不能更改“-”中的一个或多个项目,因为它们正在使用中