读书人

声明类模板并调用相应模版类的静态函数

发布时间: 2013-01-04 10:04:12 作者: rapoo

声明类模板并调用相应模版类的静态函数时出错,求助。
代码稍微有点长,请各位耐心看完
用的是VS2012写的


//Main_.cpp
#include<iostream>
#include<cstddef>
#include"简单选择排序.h"
using namespace std;
using sing::SimpleSort;
int main(void)
{
int arrList[5]={1,3,4,2,2};
SimpleSort<int>::Sort(arrList,0,5,'<');
for(size_t i=0;i<5;++i)
cout<<arrList[i]<<" ";
cout<<endl;
cin.get();
cin.get();
return(0);
}


//简单选择排序.h
//在Sort函数的第19行出错
#ifndef SIMPLESORT_H_INCLUDE_
#define SIMPLESORT_H_INCLUDE_
#include<cstddef>

namespace sing
{
template<typename T0>
class SimpleSort
{
public:
SimpleSort();
~SimpleSort();
static void Sort(T0 tArray[],const size_t startIndex,const size_t endIndex,char mode='<');
private:
static size_t Select(const T0 tArray[],size_t begin,size_t end,char mode='<');
static void Swap(T0& var0,T0& var1);
};
//构造
template<typename T0>
SimpleSort<T0>::SimpleSort(){}
//析构
template<typename T0>
SimpleSort<T0>::~SimpleSort(){}
//接口函数
template<typename T0>
void SimpleSort<T0>::Sort(T0 tArray[],const size_t startIndex,const size_t endIndex,char mode)
{
size_t index=startIndex;
for(size_t i=startIndex;i<endIndex;++i)
{
//返回从tArray数组中以mode排序方式从 i到size-1第一个符合条件的下标
index=SimpleSort<T0>::Select(tArray,i,endIndex-1,mode);
//交换两个变量的值
if(i!=index)
{
/*T0 tmp=T0[i];
T0[i]=T0[index];
T0[index]=tmp;*/
//注释掉这句,换成上面的语句一样报错
//换成Swap(T0[i],T0[index]);也一样报错
//报错类型为 将T0类型用作表达式非法 ?
SimpleSort<T0>::Swap(T0[i],T0[index]);
}
}
}
//在tArray数组中选择从begin到end中第一个符合mode条件的元素的下标返回
template<typename T0>
size_t SimpleSort<T0>::Select(const T0 tArray[],size_t begin,size_t end,char mode)
{
size_t index=begin;
T0 tmp=tArray[begin];
if(mode=='<')
{
for(++begin;begin<end;++begin)
{
if(tmp>tArray[begin])
{
index=begin;
tmp=tArray[begin];
}
}
}else
{
for(++begin;begin<end;++begin)
{
if(tmp<tArray[begin])
{
index=begin;
tmp=tArray[begin];
}
}
}
return index;
}
//交换两个元素
template<typename T0>
void SimpleSort<T0>::Swap(T0& var0,T0& var1)
{
T0 tmp;
tmp=var0;
var0=var1;
var1=tmp;
}
}
#endif

//顺便问一下,是不是类模板的函数定义必须和类模板在同一文件中?
//如果是,那为什么打开像vector这样的类模板的文件时只能看到
//它的声明部分?对于类模板无法实现类实现的隐藏吗?
[解决办法]
SimpleSort<T0>::Swap(T0[i],T0[index]);--->Swap( tArray[i], tArray[index] );
[解决办法]
T0应该换成tArray吧
[解决办法]
引用:
//顺便问一下,是不是类模板的函数定义必须和类模板在同一文件中?
//如果是,那为什么打开像vector这样的类模板的文件时只能看到
//它的声明部分?对于类模板无法实现类实现的隐藏吗?
这个没人回答一下吗?
现在大部分的编译器都不支持类模板的声明和定义分开
vector的实现代码全部看得到的啊

读书人网 >C++

热点推荐