重载字符向量和字符串 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& 获取 stringvector<char> 参数。