Mac版VS Code中vector::assign单参数调用报错的解决咨询
vector::assign单参数调用编译失败的解决方法
起初我以为是自身代码存在问题,但如下极简代码仍出现编译错误,提示必须传入2个参数:
#include <iostream> #include <vector> std::vector<int> v; int main() { int m; std::cin >> m; v.assign(m); }
若将代码改为v.assign(m,-1);,则可正常编译运行。以下是报错信息:
error: no matching member function for call to 'assign' v.assign(m); ~~^~~~ /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:623:9: note: candidate function template not viable: requires 2 arguments, but 1 was provided assign(_InputIterator __first, _InputIterator __last); ^ /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:633:9: note: candidate function template not viable: requires 2 arguments, but 1 was provided assign(_ForwardIterator __first, _ForwardIterator __last); ^ /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:635:10: note: candidate function not viable: requires 2 arguments, but 1 was provided void assign(size_type __n, const_reference __u);
原因分析
std::vector的assign方法没有只接受单个整数参数的重载:
- 第一个重载接受两个迭代器,用于按范围赋值
- 第二个重载接受
size_type n和const_reference u,用于将容器填充为n个值为u的元素
调用v.assign(m)时,编译器找不到匹配的单参数重载,因此报错。
解决办法
根据实际需求选择对应方案:
- 填充m个默认值:若想将vector设置为包含m个默认初始化的int元素(int默认值为0),可以使用
v.resize(m),或者显式传入默认值的v.assign(m, int()):// 方案1:使用resize v.resize(m); // 方案2:使用assign+默认构造值 v.assign(m, int()); - 填充m个指定值:如果需要给每个元素设置特定值,直接使用
v.assign(m, 目标值),比如你已经验证过的v.assign(m, -1)。 - 仅添加单个元素:如果你的m是要赋值的单个元素而非数量,使用
v.assign(1, m),将vector设置为包含一个值为m的元素。
内容的提问来源于stack exchange,提问作者I am me
相关产品推荐
相关产品推荐

