模板类数组

时间:2015-10-18 15:54:34

标签: c++ arrays templates

我正在尝试为需要实现不同排序算法的算法类做一个项目。我试图使用模板类声明一个数组,如图所示。我必须保持函数定义相同,因此不能更改任何参数。我的问题是我的数组声明,我得到错误“非类型模板参数是一个非常量表达式。”声明模板数组的正确方法是什么?任何帮助将不胜感激。

#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

1 个答案:

答案 0 :(得分: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)

  3. 更好的取决于你真正想做的事情。

    请注意,我不确定您的代码是否真正符合您的意图。您似乎在功能中使用T*&#39;参数作为一种方式来指示&#34;指向多个T s&#34;,而在selectionsort函数中,您突然处理了一组T指针。< / p>

    换句话说,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);