1.不知道为什么这一段不管输入什么都原样输出
#include<iostream>
using namespace std;
template<typename T>
//排序函数
void sort(T &a,T &b,T &c) //对a,b,c 3个数排序。
{
void exchange(T &a,T &b); //函数声明形参是引用。
if(a>b)
exchange(a,b); //a<=b
if(a>c)
exchange(a,c); //a<=c
if(b>c)
exchange(b,c); //b<=c
}
template<typename S>
//互换函数
void exchange(S &a,S &b)//形参是引用
{
S temp;
temp=a;
a=b;
b=temp;
}
int main( )
{
int a,b,c;
cin>>a>>b>>c;//输入3个数
float d,e,f;
cin>>d>>e>>f;
double x,y,z;
cin>>x>>y>>z;
sort(a,b,c);//调用排序函数
cout<<a<<" "<<b<<" "<<c<<endl;//输出排序后的数字
sort(d,e,f);
cout<<d<<" "<<e<<" "<<f<<endl;
sort(x,y,z);
cout<<x<<" "<<y<<" "<<z<<endl;
return 0;
}
chou多了总觉得合理,看不出问题
我把你的代码放vs里面运行了一下发现编不过,之后稍微调整了一下,发现没问题能正常输出:
代码调整如下(没改变逻辑,就改变一下函数的位置):
#include <iostream>
using namespace std;
template<typename T>
//互换函数
void exchange(T &a,T&b)//形参是引用
{
T temp;
temp=a;
a=b;
b=temp;
}
template<typename T>
//排序函数
void sort(T &a,T &b,T &c) //对a,b,c 3个数排序。
{
//void exchange(T &a,T &b); //函数声明形参是引用。
if(a>b)
exchange(a,b); //a<=b
if(a>c)
exchange(a,c); //a<=c
if(b>c)
exchange(b,c); //b<=c
}
int main( )
{
int a,b,c;
cin>>a>>b>>c;//输入3个数
float d,e,f;
cin>>d>>e>>f;
double x,y,z;
cin>>x>>y>>z;
sort(a,b,c);//调用排序函数
cout<<a<<" "<<b<<" "<<c<<endl;//输出排序后的数字
sort(d,e,f);
cout<<d<<" "<<e<<" "<<f<<endl;
sort(x,y,z);
cout<<x<<" "<<y<<" "<<z<<endl;
return 0;
}
输出结果为:
没啥问题,我也不知道你自己的具体情况,所以没办法解答。
楼主可能对类模板有一些误解。
类模板的类型在编译的时候就已经推断了,而编译是一行一行向下编译的。
在实例化sort模板的时候,(我们分别来看),比如我们实例化出一个double的sort函数,这时候T已经被实例化成了double,所以你类里面的声明exchange已经变成了exchange(double& a, double& b);
也就是说,你类里面这时候声明的是一个double, double的exchange。但是注意,这时候exchange还没有被实例化,仍然是模板,所以编译器是找不到exchange(double&, double&)的函数定义的,因此构成错误。
要是楼主想保留原来的函数顺序,可以这样改:
template<typename T>
void exchange(T & a,T & b); //函数声明形参是引用。
template<typename T>
//排序函数
void sort(T & a,T & b,T & c) //对a,b,c 3个数排序。
{
if(a>b)
exchange(a,b); //a<=b
if(a>c)
exchange(a,c); //a<=c
if(b>c)
exchange(b,c); //b<=c
}
template<typename S>
//互换函数
void exchange(S & a,S & b)//形参是引用
{
S temp;
temp=a;
a=b;
b=temp;
}
由此可见,了解类模板的实例化过程非常重要
望采纳,谢谢