通过引用传递错误结尾

问题描述:

我遇到了一个我确定很小的问题,但是当我尝试运行我的程序时,它声明了 - 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

假设SavingsCheckingsAccounts衍生自通过引用传递不起作用,因为你可以不结合临时到非const引用。

更改签名

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

传递的价值的作品,因为你有效地复制参数。

+0

@juanchopanza编辑,现在意识到OP实际上是通过指针。答案还是可以的,因为这同样适用于试图绑定到指针引用的指针临时对象。 – vsoftco

+0

由于您按值存储,因此无法避免切片。但是,指针的切片不是问题。 –

+0

不是那么奇怪,'std :: vector '是存储多态对象集合的好方法('std :: vector >'会更好),这看起来像是一个本地版本(希望用于学习目的) –