【问题标题】:Copy constructor error when initilizing a vector of custormer typed objects初始化客户类型对象向量时出现复制构造函数错误
【发布时间】:2019-04-30 10:29:42
【问题描述】:

Foo 类只有一个默认构造函数和一个复制构造函数。由 Foo 类型的对象初始化的大小为 10 的向量在某种程度上是不正确的。

#include <iostream>
#include <vector>

class Foo
{
    public:
        Foo() = default; // Error1
        Foo(Foo& foo) {  // Error2
            std::cout << "copied" << std::endl;
        }

};

int main( void )
{
    Foo f;
    std::vector<Foo> vec(10, f); // Error3
    return 0;
}

上面的示例代码有3个错误:

错误 1: 候选构造函数不可行:需要 0 个参数,但提供了 1 个

错误 2: 候选构造函数不可行:第一个参数 ('const Foo') 将丢失 const 限定符

Error3: 在此处请求的成员函数 'std::__1::vector >::vector' 的实例化中

当我在主函数中删除复制构造函数或向量时,没有错误。

问题:

代码的哪一部分错了,为什么?

附言

当向量定义被Foo ff(f) 替换时,错误也消失了。 const 限定符是向量请求的吗?

【问题讨论】:

  • 一个修改它所复制的东西的复制构造函数看起来很奇怪。
  • 仔细阅读第二个错误。
  • 尝试制作复制构造函数Foo(const Foo&amp; foo)
  • @SLN 我猜std::vector 在复制之前添加了const,以确保在一些奇怪的复制构造函数中初始对象不会被更改,比如 juanchopanza 在发表评论时想到的那些。
  • @SLN - 可以这样想。如果我在你缺课后给你讲课要抄笔记,在我的笔记本上乱涂乱画是很糟糕的形式,不是吗?

标签: c++ vector constructor copy-constructor


【解决方案1】:

查看std::vector的调用构造函数的签名:

vector(size_type n, const T& value, const Allocator& = Allocator());

参数f 由常量引用(参数value)传递。因此,该参数不能绑定到Foo 的复制构造函数的Foo&amp; 类型的非常量参数foo


相同(更简单)的情况:

Foo f;
const Foo& value = f;
Foo& foo = value;  // error

【讨论】:

  • @bolov - 抱歉什么?您不能将 non-const 引用绑定到 const 对象或由 const 引用引用的对象。这个答案完全正确。
【解决方案2】:

你使用的构造函数是std::vector::vector (2)

vector( size_type count, 
                 const T& value,
                 const Allocator& alloc = Allocator());

将在构造函数内部复制的参数value 是 const,并且由于您的复制构造函数无法从 const 复制,因此构造函数的实现无法创建副本来填充向量。

【讨论】:

    【解决方案3】:

    std::vector 的构造函数文档显示以下签名:

    explicit vector (size_type n, const value_type& val = value_type(),
                 const allocator_type& alloc = allocator_type());
    

    这表明它要求valconst 引用。因为它很可能不会在其内部处理中削减这个const,所以它似乎像这样将val 传递给复制构造函数。因为 Foo 的复制构造函数期望传递一个非 const 引用,所以 val 将失去它的 const 限定符。因为这是不允许的,所以编译器会引发错误

    错误:候选构造函数不可行:第一个参数('const Foo')将丢失 const 限定符

    【讨论】:

      猜你喜欢
      • 2018-09-08
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 2016-07-03
      • 2021-11-06
      • 2023-02-02
      • 1970-01-01
      相关资源
      最近更新 更多