1. 程式人生 > 實用技巧 >遇到 ''isSort()''declared here, later in the translation unit

遇到 ''isSort()''declared here, later in the translation unit

在編寫程式碼時,遇到
在原來的程式碼中出現這個問題


原來的程式碼:

//3  計算排序時間
    template<typename T>
    void testSort(string sortName, void(* sort) (T [],int ),T arr[],int n){
            clock_t startTime  = clock();
            sort(arr,n);
            clock_t endTime = clock();

            assert(isSort(arr,n));
            cout<<sortName<<":"<<double(endTime-startTime) / CLOCKS_PER_SEC<<"s"<<endl;
        return;
        }

    //    4   判斷是否是已排序的
    template <typename T>
    bool isSort(T arr[],int n){
        for (int i = 0;i<n-1;i++){
            if (arr[i] > arr[i+1]){
                return false;
            }
        }
        return true;
    }

上面的程式碼死活不出來,但是兩個調換順序之後就可以了,詳情見下面這個部落格 ,但是部落格中描述的是,在遇到普通函式時,需要把申明呼叫的函式先例項化,但模板函式不用,而這邊本身就是模板函式,所以還是存在一點疑惑

prog.cpp: In instantiation of ‘void foo(T) [with T = int]’:
prog.cpp:16:7: required from here
prog.cpp:6:10: error: ‘bar’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
bar(x); // OKAY
^
prog.cpp:10:6: note: ‘template void bar(T)’ declared here, later in the translation unit
void bar(T x)

在gcc 4.8中看到的那樣,它實際上並沒有編譯。編寫 template 擴充套件器時,編譯器在早期做的一件事就是將它們視為類似於巨集的東西。當它們宣告時,幾乎不會做任何事情,而在例項化它們時,將查詢所有內容。當 template 被宣告,例項化時更少。

https://www.it1352.com/2094010.html

    //    4   判斷是否是已排序的
    template <typename T>
    bool isSort(T arr[],int n){
        for (int i = 0;i<n-1;i++){
            if (arr[i] > arr[i+1]){
                return false;
            }
        }
        return true;
    }


    //3  計算排序時間
    template<typename T>
    void testSort(string sortName, void(* sort) (T [],int ),T arr[],int n){
            clock_t startTime  = clock();
            sort(arr,n);
            clock_t endTime = clock();

            assert(isSort(arr,n));
            cout<<sortName<<":"<<double(endTime-startTime) / CLOCKS_PER_SEC<<"s"<<endl;
        return;
        }