2015-10-18 106 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