重载字符向量和字符串 c++ 时,对成员函数的调用不明确
Call to member function is ambigous when overloading both vector of chars and string c++
我想通过以下方式重载一个函数:
void f(string s){
cout << "String case" << endl;
}
void f(vector<char> v){
cout << "Vector case" << endl;
}
对于我插入字符串对象或向量对象的情况,一切都很好:
int main()
{
string s = "hello";
f(s); // Prints "String case"
vector<char> v = {'a', 'b'};
f(v); // Prints "Vector case"
return 0;
}
但是如果我想运行 f({'a', 'b'});
,因为数组可以自动转换为字符串和向量,所以我得到error: call of overloaded ‘f()’ is ambiguous
。假设我想将这种情况视为向量,我该如何告诉编译器?
明确说明大括号用于初始化的类型:
f(string{'a', 'b'});
f(vector<char>{'a', 'b'});
如果您提供 initializer_list<char>
重载,调用 f
时使用大括号初始化的列表,例如 {'a', 'b'}
将 select 该重载作为最佳匹配。
您可以直接从那里显式调用 vector<char>
重载。
void f(std::initializer_list<char> v)
{
f(std::vector<char>{v}); // call the vector version
}
现在下面的调用可以正常工作了。
f({'a', 'b'}); // Prints "Vector case"
这是 demo.
请注意,您应该在各自的重载中通过 const&
获取 string
和 vector<char>
参数。
我想通过以下方式重载一个函数:
void f(string s){
cout << "String case" << endl;
}
void f(vector<char> v){
cout << "Vector case" << endl;
}
对于我插入字符串对象或向量对象的情况,一切都很好:
int main()
{
string s = "hello";
f(s); // Prints "String case"
vector<char> v = {'a', 'b'};
f(v); // Prints "Vector case"
return 0;
}
但是如果我想运行 f({'a', 'b'});
,因为数组可以自动转换为字符串和向量,所以我得到error: call of overloaded ‘f()’ is ambiguous
。假设我想将这种情况视为向量,我该如何告诉编译器?
明确说明大括号用于初始化的类型:
f(string{'a', 'b'});
f(vector<char>{'a', 'b'});
如果您提供 initializer_list<char>
重载,调用 f
时使用大括号初始化的列表,例如 {'a', 'b'}
将 select 该重载作为最佳匹配。
您可以直接从那里显式调用 vector<char>
重载。
void f(std::initializer_list<char> v)
{
f(std::vector<char>{v}); // call the vector version
}
现在下面的调用可以正常工作了。
f({'a', 'b'}); // Prints "Vector case"
这是 demo.
请注意,您应该在各自的重载中通过 const&
获取 string
和 vector<char>
参数。