2014-01-14 88 views
0

我试图创建一个用于创建给出的两倍大小的阵列的方法,然后填充与原始值的阵列和下半年以相反的顺序原始值的前半部分。我已经完成了这一点,但接下来的任务是使方法接受泛型类型的数组,我被卡住,不知道从这里到 到目前为止我的代码去:C++模板方法的语法问题

template <typename T> 

T& *copy_and_reverse(T& *a, int length) { 
    T& *result = new T&[length*2]; 
    int w = length-1; 
    for (int i = 0; i < length * 2; i++) { 
     if (i < length) { 
      result[i] = a[i]; 
     } else { 
      result[i]=a[w]; 
      w--; 
     } 
    } 
    return result; 
} 

int main() { 
    double numbers[5]={8.364,4.3,5.3,9.6,7.645}; 
    int size=sizeof numbers/sizeof(double); 
    double *pointertonumbers; 
    pointertonumbers=copy_and_reverse(numbers, size); 
    for(int i=0;i<size*2;i++){ 
     cout<<pointertonumbers[i]<<"\n"; 
    } 
} 

在代码完成的那一刻不工作,因为我得到多个“错误:不能声明指针'T &'”

+2

停止使用指针 - 不返回新的东西 - T&*是愚蠢 –

+0

采取与双打作品的版本。用“T”代替“double”的出现。在它前面放'模板'。 – Casey

回答

0

如果编译器说它不能声明指针T &然后尝试声明T *的引用。也许在这种情况下,编译器会很高兴。:)

T * copy_and_reverse(const T *a, int length) { 
    T *result = new T[length*2]; 

至于我,我会使用标准算法std :: copy。例如,

template <typename T> 
T * copy_and_reverse(const T *a, size_t length) 
{ 
    T *result = new T[ 2 * length ]; 

    std::copy(a, a + length, result); 

    std::copy(a, a + length, reverse_iterator<int *>(result + 2 * length)); 

    return result; 
} 
+0

那个位作品,但我还得到一个错误“创建引用的数组 T *结果=新T&[长度* 2];”仍然。对不起IM C++的我不很新知道为什么我没有想到的取出及 – Ben

+0

我是白痴不好意思忘记再次 – Ben

+0

的和我这样做,因为这是一个考试问题,我在几天的学习 – Ben

1

首先,您不能创建指向参考(您正在尝试做什么)的指针。引用指针将是T* &a。而且你不应该把指针返回到一个引用(并且引用一个指针,因为它会创建悬挂的引用)

实际上,最好在安全的一边并接受对数组的引用。

T* copy_and_reverse(T (&a) [N]) { 
    T *result = new T[N*2]; 
    size_t w = N-1; 
    for (size_t i = 0; i < N * 2; i++) { 
     if (i < N) { 
      result[i] = a[i]; 
     } else { 
      result[i]=a[w]; 
      w--; 
     } 
    } 
    return result; 
} 

int main() { 
    double numbers[5]={8.364,4.3,5.3,9.6,7.645}; 
    int size=sizeof numbers/sizeof(double); 
    double *pointertonumbers; 
    pointertonumbers=copy_and_reverse(numbers); 
    for(int i=0;i<size*2;i++){ 
     std::cout<<pointertonumbers[i]<<"\n"; 
    } 
    delete [] pointertonumbers; 
} 

这仍然有问题。你不应该忘记删除一个函数的结果。随着C++ 11,你可以把它改写与std::array小号真正安全:

std::array<T, N*2> copy_and_reverse(const std::array<T, N>& orig) { 
    std::array<T, N*2> result; 
    std::copy(orig.begin(), orig.end(), result.begin()); 
    std::copy(orig.begin(), orig.end(), std::reverse_iterator<typename std::array<T, N*2>::iterator>(result.end())); 
    return std::move(result); 
} 

int main() { 
    std::array<double, 5> numbers = {{8.364,4.3,5.3,9.6,7.645}}; 

    auto pointertonumbers(copy_and_reverse(numbers)); 
    for(size_t i=0;i<pointertonumbers.size();i++){ 
     std::cout<<pointertonumbers[i]<<"\n"; 
    } 
} 

这里你摆脱指针(和它的所有问题)的完全。