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下相同代码编译没有显示错误!!
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>,以及名字空间的修饰,我把你的代码改了一改就可以通过了
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);
}
#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();
》typename std::list<T*>::iterator info_iter = infolist.begin();
我看了下书,好像是在模板定义中,
编译器不知道list<T*>::iterator是代表一个类型
还是代表list<T*>类中的一个成员,叫做iterator。
编译器不知道list<T*>::iterator是代表一个类型
还是代表list<T*>类中的一个成员,叫做iterator。
恩,我明白了,我原本不用加typename的时候是在非模板的情况下面没有出过警告,比如:
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;
}
#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在模板中的用法看了一看,是这样的:
当我这样使用:
这个时候,模板已经被实例化为int类型的,这个实力中有一个类型iterator.OK,这个没有问题,没有警告直接通过.
但是,如果是这样写:
std::list<T>::iterator,编译器到实例化之前不知道具体实例化的哪个实例,假设有可能std::list<char>类型中正好有一个静态成员是iterator,那么这个就是错误的.
为了明确的告诉编译器iterator,是一个类型而不是成员的名字,我们需要在前面加上typename.
当我这样使用:
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;
}
#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.