初始化custormer类型的对象的向量时,复制构造函数错误

时间:2018-11-28 13:37:24

标签: c++ vector constructor copy-constructor

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限定符

在此处请求成员函数'std :: __ 1 :: vector> :: vector'的

错误3:

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

问题:

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

p.s。

将向量定义替换为Foo ff(f)时,错误也消失了。向量是否要求const限定词?

3 个答案:

答案 0 :(得分:4)

查看def __repr__(self): return f"Player has {'Soft' if self.soft > 0 else ''} {self.count}. Cards are {self.cards}." 的调用构造函数的签名:

std::vector

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


相同(更简单)的情况:

Foo

答案 1 :(得分:1)

您使用的构造函数为std::vector::vector (2)

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

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

答案 2 :(得分:0)

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

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

这表明需要val才能成为const引用。由于它很可能不会在内部处理中削减此const,因此似乎将val这样传递给复制构造函数。由于Foo的副本构造函数期望传递非const引用val会丢失它的const限定符。因为不允许这样做,所以编译器会引发错误

  

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