| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2412 人关注过本帖
标题:链表函数模板始终失败,编译不过,请帮我看看到底是怎么了?
只看楼主 加入收藏
laigaoat2005
Rank: 4
等 级:业余侠客
帖 子:388
专家分:226
注 册:2007-4-5
结帖率:88.89%
收藏
已结贴  问题点数:0 回复次数:3 
链表函数模板始终失败,编译不过,请帮我看看到底是怎么了?
程序代码:
/*
下面是cprimer 3rd 一道练习题:
练习 6.12 请写一个程序 使它接受下列定义 
int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89 };
list<int> ilist( ia, ia+11 );
用单个 iterator 形式的 erase()删除 ilist 中所有奇数位置的元素 
//*/
#include <vector>
#include <list>
#include <iostream>
    using namespace std;

void display(list<int>* plist )
{
    list<int>:: iterator iter=plist->begin(),iter_end=plist->end();
    cout << "plist:";
    while(iter!=iter_end)
    {
        cout << (*iter) <<"";     
        iter++;
    }
    cout << endl;
}
list<int> * test_6_12();
list<int> * test_6_12()
{
    int ia[] = { 0, 1, 2, 3, 4, 5, 4, 7, 8, 9, 10 };
    list < int > * ilist = new list< int >( ia,ia+11 );
    typedef list<int>::iterator  m_iter;
    m_iter iter = ilist->begin();
    m_iter itern = ilist->end();
    cout << "before: ";
    display(ilist);
    vector<int> del_element;
    for(int i= 0; i < 11; i++)
    {
        if ( i%2 == 1 )
        del_element.push_back(*iter);
        iter++;
    }
   
    for( int i=0; i<del_element.size(); i++)
    {
        m_iter iter;
        iter = find(ilist->begin(),    ilist->end(), del_element[i]);
        if (     (iter) !=( ilist->end() )     )
            ilist->erase(iter);
    }
    return ilist;
}
int main()
{
    display( test_6_12() ) ;       
    return 0;
}
上面是cprimer 3rd 一道练习题:
练习 6.12 请写一个程序 使它接受下列定义  
int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89 };
list<int> ilist( ia, ia+11 );
用单个 iterator 形式的 erase()删除 ilist 中所有奇数位置的元素  
//*/
在做题中,我未严格按list<int> ilist( ia, ia+11 ); 的要求,而是把它变成了一个指针。
两个问题:
一,为了找到奇数位置的元素,我试了多次,最终不得不选择了建立一个vector来存贮奇数位置的元素,感觉这样增大了开消。原因是,在用erase方法中,erase一个元素后,list的元素数量变化,会导致iter越界造成运行时错误。
  请高手们点评一下,或者告诉我你们的好思路。
二,想让让display()函数能同时输出 list 和vector,我想把display()函数设计成一个模板,但试了几种方法都不行。请教高手帮忙给个例子。
下面的我的失败记录:
第一种错:
程序代码:
template < class Elem_Type >
void display(  Elem_Type* plist )
{
    Elem_Type iterator iter=plist->begin(),iter_end=plist->end();
    cout << "plist:";
    while(iter!=iter_end)
    {
        cout << (*iter) <<"";     
        iter++;
    }
    cout << endl;
}


第二种错:
程序代码:
template < class A, class B >
void display(A<B>* plist )
{
    A<B>:: iterator iter=plist->begin(),iter_end=plist->end();
    cout << "plist:";
    while(iter!=iter_end)
    {
        cout << (*iter) <<"";     
        iter++;
    }
    cout << endl;
}


为什么都不行?我用单一元素都能成功。但一变成容器就失败。
请教朋友们给我帮助,谢谢。

[ 本帖最后由 laigaoat2005 于 2011-4-30 17:53 编辑 ]
搜索更多相关主题的帖子: 元素 练习题 
2011-04-30 17:50
laigaoat2005
Rank: 4
等 级:业余侠客
帖 子:388
专家分:226
注 册:2007-4-5
收藏
得分:0 
程序代码:
template < typename AA >
void display(list<AA> * plist )
{
    list <int>:: iterator iter=plist->begin(),iter_end=plist->end();
    cout << "plist:";
    while(iter!=iter_end)
    {
        cout << (*iter) <<"";     
        iter++;
    }
    cout << endl;
}
上面这个能通过了。但是,如果弄成下面的样子就出错:
程序代码:
template <typename BB ,  typename AA >
void display(BB<AA> * plist )
{
    BB <int>:: iterator iter=plist->begin(),iter_end=plist->end();
    cout << "plist:";
    while(iter!=iter_end)
    {
        cout << (*iter) <<"";     
        iter++;
    }
    cout << endl;
}

--------------------配置: mingw5 - CUI Debug, 编译器类型: MinGW--------------------

检查文件依赖性...
正在编译 D:\我的文档\study\abstract_container_types.cpp...
[Error] D:\我的文档\study\abstract_container_types.cpp:72: error: `BB' is not a template
[Error] D:\我的文档\study\abstract_container_types.cpp:74: error: `BB' is not a template
[Error] D:\我的文档\study\abstract_container_types.cpp:74: error: expected initializer before "iter"
[Error] D:\我的文档\study\abstract_container_types.cpp:76: error: `iter' was not declared in this scope
[Error] D:\我的文档\study\abstract_container_types.cpp:76: error: `iter_end' was not declared in this scope
[Error] D:\我的文档\study\abstract_container_types.cpp:133: error: no matching function for call to `display(std::list<int, std::allocator<int> >*&)'
[Error] D:\我的文档\study\abstract_container_types.cpp:156: error: no matching function for call to `display(std::list<int, std::allocator<int> >*)'

构建中止 abstract_container_types: 7 个错误, 0 个警告

如果写成这样:也错:
程序代码:
template <typename BB ,  typename AA >
void display(typename BB<AA> * plist )
{
    typename BB <int>:: iterator iter=plist->begin(),iter_end=plist->end();
    cout << "plist:";
    while(iter!=iter_end)
    {
        cout << (*iter) <<"";     
        iter++;
    }
    cout << endl;
}

--------------------配置: mingw5 - CUI Debug, 编译器类型: MinGW--------------------

检查文件依赖性...
正在编译 D:\我的文档\study\abstract_container_types.cpp...
[Error] D:\我的文档\study\abstract_container_types.cpp:72: error: variable or field `display' declared void
[Error] D:\我的文档\study\abstract_container_types.cpp:72: error: template declaration of `int display'
[Error] D:\我的文档\study\abstract_container_types.cpp:72: error: expected nested-name-specifier before "BB"
[Error] D:\我的文档\study\abstract_container_types.cpp:72: error: expected `(' before "BB"
[Error] D:\我的文档\study\abstract_container_types.cpp:133: error: `display' was not declared in this scope
[Error] D:\我的文档\study\abstract_container_types.cpp:156: error: `display' was not declared in this scope
[Error] D:\我的文档\study\abstract_container_types.cpp:156: error: missing template arguments before ',' token
[Error] D:\我的文档\study\abstract_container_types.cpp:156: error: expected primary-expression before "int"
[Error] D:\我的文档\study\abstract_container_types.cpp:156: error: expected `;' before "int"

构建中止 abstract_container_types: 9 个错误, 0 个警告

请班主帮帮忙。谢谢。
2011-04-30 19:53
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:20 
你要是问的是2楼得话,那就写成这样,一楼太长就不看了。
template <template <typename T> class BB ,typename AA >
这里涉及一个模板的模板参数。因为BB是一个类模板需要特别照顾、

离恨恰如春草,更行更远还生。
2011-04-30 20:08
laigaoat2005
Rank: 4
等 级:业余侠客
帖 子:388
专家分:226
注 册:2007-4-5
收藏
得分:0 
谢谢。
2011-04-30 20:45
快速回复:链表函数模板始终失败,编译不过,请帮我看看到底是怎么了?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029506 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved