gpt4 book ai didi

c++ - vector 调整大小似乎需要 C++ 中的默认构造函数 >= 11

转载 作者:行者123 更新时间:2023-12-04 16:25:13 24 4
gpt4 key购买 nike

我有以下测试代码,其中我创建了一个 foo 类的 std::vector 和后来 resize 它。

#include <iostream>
#include <vector>
#include <algorithm>

class foo {
public:
foo(int n) : num(n) {}
//foo() : num(42) {}
~foo () { std::cout << "destructor" << std::endl; }
void print() { std::cout << num << std::endl; }
protected:
int num;
};


int main()
{
std::vector<foo> v = { 3,2,1,7,5,1,8,9 };
v.resize(2);

for (auto obj: v)
obj.print();

return 0;
}

当默认构造函数被注释掉时,我得到编译错误:

Error C2512 'foo::foo': no appropriate default constructor available

我使用 Visual Studio 2019 编译,语言设置为 C++ 17。我不理解此错误消息,因为在 C++ >= 11 中,std::vector::resize 具有以下内容过载:

void resize (size_type n)

所以我应该能够在没有默认值或没有定义默认构造函数的情况下调用它。怎么回事?

最佳答案

是和不是。

您当前使用的重载确实如此。然而,还有第二个重载,您可以在其中为新元素提供一个值 - 即使您知道要将其调整为更小的尺寸,这也是必需的。

constexpr void resize( size_type count, const value_type& value );

所以要么:

v.resize(2, 0);

erase你不想保留的元素。这样,您无需提供值。

v.erase(std::next(v.begin(), 2), v.end());

如果你想使用 resize() 作为调整大小的主要方法,你可以添加一个辅助函数,它只使用 erase() 作为类型的后备不可默认构造。

#include <type_traits>

template <typename C>
void downsize(C& c, std::size_t size) {
if (size < c.size()) {
if constexpr (std::is_default_constructible_v<typename C::value_type>) {
c.resize(size);
} else {
c.erase(std::next(c.begin(), size), c.end());
}
}
}

关于c++ - vector 调整大小似乎需要 C++ 中的默认构造函数 >= 11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66154253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com