一个C++模板的问题,VC6.0通过, GCC不能通过!!

来源:互联网 发布:商业银行网络专线 编辑:程序博客网 时间:2024/06/05 18:48

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.

原创粉丝点击