c++ - 矢量调整大小似乎需要 C++ 中的默认构造函数 >= 11
问题描述
我有以下测试代码,我在其中创建了一个std::vector
类foo
,然后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;
}
当默认构造函数被注释掉时,我得到编译错误:
错误 C2512 'foo::foo': 没有合适的默认构造函数可用
我使用 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());
}
}
}
推荐阅读
- ios - 使用分段控件隐藏或显示静态 TableViewController 单元格
- reactjs - 根据添加的元素 React 滚动网页到
- vb.net - VB.Net 应用程序不返回所有 Oracle 数据行
- python - 素数列表生成器在运行时立即关闭
- spring - 从 Spring Data ReactiveMongoRepository 使用排序规则的智能方法
- ios - 尝试从单独的视图控制器更改表格视图单元格标签时调用了两次自定义委托方法
- html - 如何根据选择的结果更改选择的颜色?
- mysql - SQL - 为员工建模角色
- node.js - 使用更新权限事件触发不同的意图
- jquery - 保护我的 ajax 请求包含在 jquery 函数中