C++三个数从小到大排序/输出(引用),但是输什么结果都不变

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;

}

由此可见,了解类模板的实例化过程非常重要

望采纳,谢谢