2014-01-14 127 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"; 
    } 
} 

這裏你擺脫指針(和它的所有問題)的完全。