在程序中错误地输入模板类型的输入

时间:2016-02-09 05:15:42

标签: c++ templates

这是我的程序与模板的代码片段。它没有错误,但是当我打印时,它会产生错误的结果。请告诉我哪里错了,我该如何解决这个问题。以下是具有三个函数的C ++代码和一个带有模板T的主函数。

#include<iostream>
using namespace std;

template<typename T>
void input(T* &start, int size){
    start = new T[size];
    T* beyond = &start[size];

    while(start != beyond){
        cout<<"\nEnter: ";
        cin>>*start;
        start++;
    }
}


template<typename T>
void sort(T* start, int size){
    T hold;

    for(int j=0; j<size-1; j++){
        for(int i=0; i<size-1; i++){
            if(start[i]>start[i+1]){
                    hold=start[i];
                    start[i]=start[i+1];
                    start[i+1]=hold;
            }
        }
    }
}


template<typename T>
void display(T* start, int size){
    T* beyond = &start[size];
    cout<<"\nAfter Sorting: "<<endl;

    while(start != beyond){
        cout<<*start<<"\t";
        start++;
    }
}

int main(){
    int* x=NULL;
    float* y=NULL;
    char* z=NULL;
    int size;

    cout<<"Enter the number of elements: ";
    cin>>size;

    cout<<"\nEnter integer values:";
    input<int>(x, size);
    sort<int>(x, size);
    display<int>(x, size);

/** 
    cout<<"\nEnter floating values:";
    input<float, int>(y, size);
    sort<float, int>(y, size);
    display<float, int>(y, size);

    cout<<"\nEnter character values:";
    input<char, int>(z, size);
    sort<char, int>(z, size);
    display<char, int>(z, size);
    */
    system("pause");
}

2 个答案:

答案 0 :(得分:0)

你可以这样做:

template<typename T>
void input(T* &start, int size){
    start = new T[size];
    //T* beyond = &start[size-1];

    //while(start <= beyond){
    for(int i=0;i<size;i++){
        cout<<"\nEnter: ";
        cin>>start[i];
        //start++;
    }
    //}
}

template<typename T>
void display(T* start, int size){
    //T* beyond = &start[size-1];
    cout<<"\nAfter Sorting: "<<endl;

    for(int i=0;i<size;i++){
        cout<<start[i]<<"\t";
    }
}

这是一个更简单的形式来做你想做的事情并且有效。

答案 1 :(得分:0)

input功能中,您可以分配内存并将其存入start。然后将该指针移动到结尾,该结束值将返回给调用函数。然后你尝试使用它作为其他方法的开始,这将导致未定义的行为。

template<typename T>
void input(T* &start, int size){
    start = new T[size]; // points to the start
    T* beyond = &start[size];

    while(start != beyond){
        cout<<"\nEnter: ";
        cin>>*start;
        start++; // Moving all the time...
    }
    // In the end start points to beyond and main gets that as a result
}

如果您真的想玩指针,可以轻松修复:

template<typename T>
void input(T* &start, int size){
    start = new T[size];
    T* beyond = &start[size];
    T* curr = start;

    while(curr != beyond){
        cout<<"\nEnter: ";
        cin>>*curr;
        curr++;
    }
}

这样start指针始终指向开头,并正确返回到调用函数。

在调试器中逐步运行会轻松显示此问题。另外,请始终描述问题,我们不知道&#34;产生错误的结果&#34;意味着,如果你没有解释什么是正确的结果,或者你得到了什么,而不是某些输入。