关于模板定义与使用的问题。怎么使用哦?

firecityplans 2009-09-14 02:31:20
定义如下的函数模板,没对它使用前进行编译是正确的。可是当对它使用时却出现了错误

程序代码如下。这函数模板是用来接受表示未知类型迭代器的一对值,找出在序列中出现得最频繁的值。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

template <typename T>
typename T::value_type mostfnc( T first, T last )
{
//T::
size_t amount = 0;
T start = first;

while( start != last )
{
start++;
amount ++;
}

typename vector< typename T::value_type > VectType;

VectType vec[amount];

VectType::iterator VectFirst = vec.begin();
VectType::iterator VectEnd = vec.end();

uninitialized_copy( first, last, VectFirst ); //将first到last的容器内的值拷贝到以VectFirst开始的容器内!

sort( VectFirst, VectEnd );

size_t maxOcuu = 0;
size_t occ = 0;

VectType::iterator PriIter = VectFirst;
VectType::iterator maxOccuItem = VectFirst;

while( VectFirst != VectEnd )
{
if ( *VectFirst != *PriIter )
{
if (occ>maxOcuu)
{
maxOcuu = occ;
maxOccuItem = PriIter;
}

occ++;
PriIter = VectFirst;
VectFirst++;
}
}

if (occ>maxOcuu)
{
maxOcuu = occ;
maxOccuItem = PriIter;
}


return *maxOccuItem;
}




int main()
{

int arr[18] = {1,2,3,4,5,6,7,8,9,1,1,2,2,2,3,3,3,8};

vector< int > vec(arr,arr+18 );

vector< int >::iterator beg1 = vec.begin();
vector< int >::iterator end1 = vec.end();

cout<<mostfnc(beg1,end1)<<endl;;


return 0;
}


出现了如下错误:

16_12.cpp(8) : error C2893: Failed to specialize function template 'generic-type-257 __cdecl mostfnc(T,T)'
With the following template arguments:
'int *'
16_12.cpp(8) : error C2146: syntax error : missing ';' before identifier 'mostfnc'
16_12.cpp(8) : error C2065: 'T' : undeclared identifier
16_12.cpp(8) : error C2146: syntax error : missing ')' before identifier 'first'
16_12.cpp(8) : error C2059: syntax error : ')'
Error executing cl.exe.

16_12.obj - 5 error(s), 0 warning(s)

不知怎样处理哦!可能是函数模板返回类型方面的问题。
...全文
122 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yshuise 2009-09-15
  • 打赏
  • 举报
回复
template <typename T>
typename T::value_type mostfnc( T first, T last )
{
泛型函数是不可能这些写的,因为这意味着需要瞒着T::vaule_type,才能使用这个函数。
我用数组呢?
firecityplans 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yshuise 的回复:]
泛型不是这样写的。看看STL的源代码吧,你这种方式限制太多。

[/Quote]

这只是一个模板函数。
yshuise 2009-09-15
  • 打赏
  • 举报
回复
泛型不是这样写的。看看STL的源代码吧,你这种方式限制太多。
firecityplans 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mstlq 的回复:]
给楼主一个逻辑上没有问题的代码……
至于VC6,学习模板的话,就请远离它吧……
C/C++ code
#include<iostream>
#include<vector>
#include<algorithm>usingnamespace std;

template<typename T>
typename T::value_type mostfnc(typename T::iterator first, typename T::iterator last)
{//T:: size_t amount=0;
typename T::iterator start= first;while (start!= last)
{
start++;
amount++;
}/*typename vector <typename T::value_type > VectType;*/
typedef vector<typename T::value_type> VectType;

VectType vec(amount);//mark
typename VectType::iterator VectFirst= vec.begin();//mark typename VectType::iterator VectEnd= vec.end();//mark
copy(first, last, VectFirst);//将first到last的容器内的值拷贝到以VectFirst开始的容器内!
sort(VectFirst, VectEnd);

size_t maxOcuu=0;
size_t occ=0;

typename VectType::iterator PriIter= VectFirst;//mark typename VectType::iterator maxOccuItem= VectFirst;//markwhile (VectFirst!= VectEnd)
{if (*VectFirst!=*PriIter)
{if (occ>maxOcuu)
{
maxOcuu= occ;
maxOccuItem= PriIter;
}

occ=0;
}
occ++;
PriIter= VectFirst;
VectFirst++;
}if (occ>maxOcuu)
{
maxOcuu= occ;
maxOccuItem= PriIter;
}return*maxOccuItem;
}int main()
{int arr[18]= {1,2,3,4,5,6,7,8,9,1,1,2,2,2,3,3,3,8};

vector<int> vec(arr,arr+18);

vector<int>::iterator beg1= vec.begin();
vector<int>::iterator end1= vec.end();

cout<<mostfnc<vector<int>>(beg1,end1)<<endl;;return0;
}
[/Quote]

看来大侠是有其它开发模板的工具哦?有windows平台下的么?linux下的呢?有的话给推荐个啊。小的话给我发个也行啊。呵呵。谢谢! email:360729326@163.com或QQ:360729326
firecityplans 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yshuise 的回复:]
template <typename T>
typenameT::value_type mostfnc( T first,  T last )
{
泛型函数是不可能这些写的,因为这意味着需要瞒着T::vaule_type,才能使用这个函数。
我用数组呢?
[/Quote]
谢谢提醒啊。这里我只是写一个函数模板,没别的意思啊。
ysysbaobei 2009-09-14
  • 打赏
  • 举报
回复
顶下
mstlq 2009-09-14
  • 打赏
  • 举报
回复
给楼主一个逻辑上没有问题的代码……
至于VC6,学习模板的话,就请远离它吧……

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

template <typename T>
typename T::value_type mostfnc(typename T::iterator first, typename T::iterator last)
{
//T::
size_t amount = 0;
typename T::iterator start = first;

while (start != last)
{
start++;
amount ++;
}

/*typename vector <typename T::value_type > VectType;*/
typedef vector <typename T::value_type > VectType;

VectType vec(amount); //mark

typename VectType::iterator VectFirst = vec.begin();//mark
typename VectType::iterator VectEnd = vec.end();//mark

copy(first, last, VectFirst); //将first到last的容器内的值拷贝到以VectFirst开始的容器内!

sort(VectFirst, VectEnd);

size_t maxOcuu = 0;
size_t occ = 0;

typename VectType::iterator PriIter = VectFirst;//mark
typename VectType::iterator maxOccuItem = VectFirst;//mark

while (VectFirst != VectEnd)
{
if (*VectFirst != *PriIter)
{
if (occ>maxOcuu)
{
maxOcuu = occ;
maxOccuItem = PriIter;
}

occ=0;
}
occ++;
PriIter = VectFirst;
VectFirst++;
}

if (occ>maxOcuu)
{
maxOcuu = occ;
maxOccuItem = PriIter;
}


return *maxOccuItem;
}


int main()
{

int arr[18] = {1,2,3,4,5,6,7,8,9,1,1,2,2,2,3,3,3,8};

vector <int > vec(arr,arr+18);

vector <int >::iterator beg1 = vec.begin();
vector <int >::iterator end1 = vec.end();

cout <<mostfnc<vector<int> >(beg1,end1) <<endl;;


return 0;
}
firecityplans 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mstlq 的回复:]
C/C++ code
#include<iostream>
#include<vector>
#include<algorithm>usingnamespace std;

template<typename T>
typename T::value_type mostfnc(T first, T last)
{//T:: size_t amount=0;
T start= fir¡­
[/Quote]

还有这个代码在VS2005下可以运行的。但是在VS6.0下就不能运行了。
firecityplans 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mstlq 的回复:]
C/C++ code
#include<iostream>
#include<vector>
#include<algorithm>usingnamespace std;

template<typename T>
typename T::value_type mostfnc(T first, T last)
{//T:: size_t amount=0;
T start= fir¡­
[/Quote]


谢谢你的纠正,可是还是有问题的。仍然出现我所贴出来的错误。
mstlq 2009-09-14
  • 打赏
  • 举报
回复
出门去……
请楼主自行思考原因……
mstlq 2009-09-14
  • 打赏
  • 举报
回复

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

template <typename T>
typename T::value_type mostfnc(T first, T last)
{
//T::
size_t amount = 0;
T start = first;

while (start != last)
{
start++;
amount ++;
}

/*typename vector <typename T::value_type > VectType;*/
typedef vector <typename T::value_type > VectType;

VectType vec(amount); //mark

typename VectType::iterator VectFirst = vec.begin();//mark
typename VectType::iterator VectEnd = vec.end();//mark

uninitialized_copy(first, last, VectFirst); //将first到last的容器内的值拷贝到以VectFirst开始的容器内!

sort(VectFirst, VectEnd);

size_t maxOcuu = 0;
size_t occ = 0;

typename VectType::iterator PriIter = VectFirst;//mark
typename VectType::iterator maxOccuItem = VectFirst;//mark

while (VectFirst != VectEnd)
{
if (*VectFirst != *PriIter)
{
if (occ>maxOcuu)
{
maxOcuu = occ;
maxOccuItem = PriIter;
}

occ++;
PriIter = VectFirst;
VectFirst++;
}
}

if (occ>maxOcuu)
{
maxOcuu = occ;
maxOccuItem = PriIter;
}


return *maxOccuItem;
}


int main()
{

int arr[18] = {1,2,3,4,5,6,7,8,9,1,1,2,2,2,3,3,3,8};

vector <int > vec(arr,arr+18);

vector <int >::iterator beg1 = vec.begin();
vector <int >::iterator end1 = vec.end();

cout <<mostfnc(beg1,end1) <<endl;;


return 0;
}

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧