![]() |
#2
laigaoat20052011-04-30 19:53
![]() 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 个警告 请班主帮帮忙。谢谢。 |

/*
下面是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 一道练习题: 下面是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;
}
练习 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;
}
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;
}
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 编辑 ]