遇到 ''isSort()''declared here, later in the translation unit
阿新 • • 發佈:2020-11-17
在編寫程式碼時,遇到
在原來的程式碼中出現這個問題
原來的程式碼:
//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 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; }