2015-04-12 88 views
0

我遇到了一個我確定很小的問題,但是當我嘗試運行我的程序時,它聲明瞭 - push_back(T &):cannot convert argument 1 from 'Savings*' (or Checkings*) to 'Account *&通過引用傳遞錯誤結尾

它工作,如果我從push_back參數中刪除&,但我不明白當您嘗試通過引用而不是複製傳遞時有什麼不同。它不應該一樣嗎?
我已經在源代碼文件中添加了錯誤開始的代碼,並在MyVector.h中添加了push_back函數。

source.cpp:

MyVector<Account*> acc; 

acc.push_back(new Savings(new Person("Bilbo Baggins", "43 Bag End"), 1, 500, 0.075)); 
acc.push_back(new Checkings(new Person("Wizard Gandalf", "Crystal Palace"), 2, 1000.00, 2.00)); 
acc.push_back(new Savings(new Person("Elf Elrond", "Rivendell"), 3, 1200, 0.050)); 

MyVector.h:

template<class T> 
void MyVector<T>::push_back(T& n) 
{ 
    if (vCapacity == 0) 
    { 
     vCapacity++; 
     T* tmp = new T[vCapacity]; 
     delete[] vArray; 
     vArray = tmp; 
    } 

    if (vSize >= vCapacity) 
    { 
     grow(); 
    } 
    vArray[vSize] = n; 
    vSize++; 
} 
+1

如果你不修改參數,使它成爲'const',並保存你的調用者一些惱人的解決方法。 – chris

+1

我會假設'Savings'和'Checkings'從'Account'繼承? – EMBLEM

回答

3

假設SavingsCheckingsAccounts衍生自通過引用傳遞不起作用,因爲你可以不結合臨時到非const引用。

更改簽名

template<class T> 
void MyVector<T>::push_back(const T& n) 

傳遞的價值的作品,因爲你有效地複製參數。

+0

@juanchopanza編輯,現在意識到OP實際上是通過指針。答案還是可以的,因爲這同樣適用於試圖綁定到指針引用的指針臨時對象。 – vsoftco

+0

由於您按值存儲,因此無法避免切片。但是,指針的切片不是問題。 –

+0

不是那麼奇怪,'std :: vector '是存儲多態對象集合的好方法('std :: vector >'會更好),這看起來像是一個本地版本(希望用於學習目的) –