【问题标题】:Passing by reference ends in error引用传递以错误结束
【发布时间】:2015-04-12 21:12:47
【问题描述】:

我遇到了一个我确信很小的问题,但是当我尝试运行我的程序时,它指出 - push_back(T &):cannot convert argument 1 from 'Savings*' (or Checkings*) to 'Account *&

如果我从 push_back 参数中删除 & ,它会起作用,但我不明白当你尝试通过引用而不是复制传递时有什么区别。不应该是一样的吗?
我已经附上了 source.cpp 文件中错误开始的代码和 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++;
}

【问题讨论】:

  • 如果您不修改参数,请将其设为const 并为您的调用者节省一些烦人的解决方法。
  • 我会假设 SavingsCheckings 继承自 Account?

标签: c++ function templates pointers reference


【解决方案1】:

假设 SavingsCheckings 派生自 Accounts,则通过引用传递不起作用,因为您无法将临时引用绑定到非常量引用。

将签名改为

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

按值传递有效,因为您有效地复制了参数。

【讨论】:

  • @juanchopanza 已编辑,现在意识到 OP 实际上是在传递指针。答案仍然可以,因为这同样适用于试图绑定到指针引用的临时指针。
  • 由于您是按值存储,因此无法避免切片。但是,指针切片不是问题。
  • 不是很奇怪,std::vector&lt;Base*&gt; 是存储多态对象集合的好方法(std::vector&lt;std::unique_ptr&lt;Base&gt;&gt; 会更好),这看起来像一个本土版本(希望用于学习目的)
猜你喜欢
  • 2011-01-30
  • 1970-01-01
  • 2014-02-08
  • 2013-05-01
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多