c ++模板方法语法问题

时间:2014-01-14 21:12:52

标签: c++ arrays pointers generics

我正在尝试创建一个方法来创建一个给定大小加倍的数组,然后用原始值填充数组的前半部分,而后半部分用相反的顺序填充原始值。我已经完成了这个,但下一个任务是让方法接受泛型类型的数组,我卡住了,不知道从哪里开始 我的代码到目前为止:

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&amp;'”

2 个答案:

答案 0 :(得分: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 s重写非常安全

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";
    }
}

在这里你完全摆脱了指针(及其所有问题)。

答案 1 :(得分:0)

如果compilre说它不能声明指向T&amp;然后尝试声明对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;
}