ここでは、vector または initializer_list のいずれかを入力として持つ一連のオーバーロードされた関数があります。そして、クライアント コードが空の initializer_list を入力する特殊なケースを処理したいと考えています。問題は、コンパイラがそのような空のリストで想定されていたデータを判断できないことです。したがって、私の質問は、そのような場合に関数宣言でどのように対処するかです。
#include <string>
#include <vector>
using namespace std;
void func(vector<string> v) { }
void func(vector<wstring> v) { }
void func(initializer_list<string> iv) {}
void func(initializer_list<wstring> iv) {}
int main() {
using namespace std;
func({"apple", "banana"});
func({L"蘋果", L"香蕉"});
func({}); // special case
}
エラーメッセージ:
<stdin>: In function 'int main()':
<stdin>:14:10: error: call of overloaded 'func(<brace-enclosed initializer list>)' is ambiguous
<stdin>:14:10: note: candidates are:
<stdin>:5:6: note: void func(std::vector<std::basic_string<char> >)
<stdin>:6:6: note: void func(std::vector<std::basic_string<wchar_t> >)
<stdin>:7:6: note: void func(std::initializer_list<std::basic_string<char> >)
<stdin>:8:6: note: void func(std::initializer_list<std::basic_string<wchar_t> >)
void func(initializer_list<void> iv) {}
- 効果はありません。適切に宣言する方法がわかりません。