2

对于我在函数加载中的作业,我实例化了一个 ifstream 对象,打开一个文件并开始读入,得到长编译器错误。我也尝试过通过重定向输入来摆脱 fstream 并使用 cin,但我从来没有走到那一步。完全相同的错误,除了使用 cin 而不是 in。

    #ifndef _BUBBLE_SORT_H
    #define _BUBBLE_SORT_H

    #include <iostream>
    #include <fstream>
    #include <cstdlib>

    using namespace std;

    template <typename T>
    void swap(T *a, T *b){
            T t = *a; 
            *a = *b; 
            *b = t;
    }

    template <typename T>
    void bubbleSort(T * arr, int n){ 
            bool isSorted = false;
            for (int last = n-1; last > 0 && !isSorted; last--) {
                    isSorted = true;
                    for (int i = 0; i < last; i++)
                            if (arr[i] > arr[i+1]) {
                                    swap((arr+i), (arr+i+1));
                                    isSorted = false;
                             }
                    if (last % 1000 == 0) cerr << ".";
            }
    }

    template <typename T>
    void print(T arr[], int n){ 
            for(int i = 0; i < n; i++)
                    cout << arr[i] << '\t';
    }

    template <typename T>
    T &load(string filename, int &n){
            ifstream in; 
            in.open(filename.c_str());

            in >> n;
            if(!in) {
                    cerr << "Error opening file" ;
                    exit(1);
            }   
            T *arr = new T[n];

            for(int i = 0; i < n; i++)
                    in >> *(arr + i); 
            in.close();
            return *arr;
    } 

#endif

我正在使用 gnu gcc 编译器

4

1 回答 1

1

问题在于对加载函数的调用。你在调用它,表明你正在读取的数组的类型?以下是编辑加载函数以返回数组的建议,以及主函数中的调用者:

template <typename T>
T *load(string filename, int &n){
        ifstream in; 
        in.open(filename.c_str());

        in >> n;
        if(in.fail()) {
                cerr << "Error opening file" ;
                exit(1);
        }   
        T *arr = new T[n];

        for(int i = 0; i < n; i++)
                in >> *(arr + i); 
        in.close();
        return arr;
} 

int main(){
        int x, i;
        string fileName = "test.txt";
        double *arr = load<double>(fileName, x); // make sure you have <double> in the call
        for(i = 0; i < x; i++) cout << arr[i] << endl;
        delete [] arr;
        return 0;
        }

确保你包含你正在读取的数组类型,比如说,double,否则你会得到一个错误。另外,以我的拙见,最好返回一个如上面代码片段所示的指针。希望有帮助。

编辑

模板工作方式的一些额外内容。编译代码时,模板会扩展为同一函数的多个不同版本,具体取决于在整个程序中使用了多少不同类型(并由 T 表示)。因此,考虑到这一点并查看问题中提出的代码,尝试从文件输入流中读取类型 T 是没有意义的,因为编译器无法扩展到基于未知类型的任何函数。但是,当模板变量 T 的类型已知时(在您typename的 s 都出现在函数参数中的情况下),则<double>可以省略规范,因为它是从函数调用中传递的参数类型推断出来的。

于 2013-03-04T20:12:04.990 回答