2015-10-18 37 views
0

我正在嘗試執行需要實現不同排序算法的算法類的項目。我想要使​​用模板類聲明一個數組,如圖所示。我必須保持函數定義相同,因此不能更改任何參數。我的問題是我的數組聲明,我得到的錯誤「非類型模板參數是一個非常量表達式。」聲明模板數組的正確方法是什麼?任何幫助將不勝感激。模板類數組

#ifndef __SORTING_HPP 
#define __SORTING_HPP 

#include "SortingHelper.h" 
#include <iostream> 
template <class T> 
class Sorting 
{  
    public: 
     T selectionsort(T* data, int size); 
     T insertionsort(T* data, int size); 
     T mergesort(T* data, int size, T* temp); 
     T quicksort(T* data, int size); 
     T data; 
}; 
template <class T> void selectionsort(T* data, int size) 
{ 
    std::array<T*, size> myarray = data; 
    int min = 0; 
    int temp = 0; 
    if (isSorted(data, size)) 
    { 
     return *data; 
    } 
    else 
    { 
     for (int i=0; i < size - 1; i++) 
     { 
      min = i; 
      for (int j=i+1; j < size; j++) 
      { 
       if (data[j] < data[min]) 
       min= j; 
      } 
      if (min != i) 
      { 
       temp = data[i]; 
       data[i] = data[min]; 
       data[min] = temp; 
      } 
     } 
    } 
} 
#endif 
+0

變化 模板無效選擇排序(T *數據,INT大小) 模板無效排序::選擇排序(T *數據,INT大小) –

+0

嗯......但現在我得到「排序不是類,名稱空間或枚舉「 – IronCode

+0

'std :: array '對我來說看起來很奇怪。難道你不是指'std :: array '?你真的想要一個指針數組嗎? – PaulMcKenzie

回答

2
template <class T> void selectionsort(T* data, int size) 
{ 
    std::array<T*, size> myarray = data; 

size只在運行時已知的。在編譯時必須知道std::array的大小。

有兩種方法來解決這個問題:

  1. 使用std::vector<T*>而不是std::array<T*, size>

  2. 使size模板參數:template <class T, int size> void selectionsort(T* data)

什麼更好取決於你實際上想做什麼。


請注意,我不確定您的代碼是否確實按照您的意圖執行了操作。您似乎在函數參數中使用T*作爲「指向多個T」的方法,而在selectionsort函數中,您突然處理的是一組T指針。

換句話說,std::array<T*, size>(或std::vector<T*>)是集合T*,不是T集合。您可能希望使用std::array<T, size>(或std::vector<T>),然後使用在函數中收到的T*T*指向的T對象複製到容器中。例如:

std::vector<T> myarray(data, data + size); 
+0

啊,好吧,我現在看到。對不起,我在指針的概念上掙扎。但是,當我使用一個向量時,真的很快,我收到錯誤沒有成員名稱'矢量'在命名空間std? – IronCode

+0

@IronCode:你必須#include正確的標準庫頭文件。在'std :: vector'的情況下,'#include '。 –

+0

修正它,就在你發佈之前。謝謝 – IronCode