【发布时间】:2020-06-14 05:30:32
【问题描述】:
考虑这个程序-
#include <string>
#include <vector>
#include <set>
void fun(const std::string& val) {
}
void fun(std::vector<std::string> val) {
}
int main()
{
std::set<std::string> example;
fun({std::begin(example), std::end(example)});
}
在编译时,我遇到了这些错误-
prog.cc: In function 'int main()':
prog.cc:13:49: error: call of overloaded 'fun(<brace-enclosed initializer list>)' is ambiguous
13 | fun({std::begin(example), std::end(example)});
| ^
prog.cc:4:6: note: candidate: 'void fun(const string&)'
4 | void fun(const std::string& val) {
| ^~~
prog.cc:7:6: note: candidate: 'void fun(std::vector<std::__cxx11::basic_string<char> >)'
7 | void fun(std::vector<std::string> val) {
| ^~~
我知道std::string 有一个构造函数重载,它像这样接收initializer_list -
basic_string( std::initializer_list<char> ilist,
const Allocator& alloc = Allocator() );
而std::vector<std::string> 有一个看起来像这样的重载-
vector( std::initializer_list<std::string> init,
const Allocator& alloc = Allocator() );
因此,很明显这两种方法的类型不同。一个接受initializer_list 的char 和另一个std::string 类型。
在我的代码中,当我传递字符串的初始值设定项列表时,我将 2 个迭代器传递给一组字符串。
即便如此,为什么编译器会将此标记为模棱两可的调用?
【问题讨论】:
-
"在我的代码中,当我传递字符串的初始化列表时,我将 2 个迭代器传递给一组字符串。" 不,您的初始化列表有两个迭代器;它不是字符串列表。
-
你知道你没有有一个
std::string的初始化列表,而是std::set<std::string>::const_iterator吗? -
此外,它实际上不是
std::initializer_list除非 & 直到它实际上是初始化表达式绑定的内容。例如如果T有T(std::set<std::string>::const_iterator, std::set<std::string>::const_iterator,则任何void fun(T)都将起作用。或者在给定一些转换链的情况下等效的东西...... -
@MooingDuck
const_来自哪里?
标签: c++ templates iterator overloading initializer-list