Poniższy kod kompiluje grzywny w GCC, ale w Visual Studio skutkujeDlaczego kolejność parametrów szablonu ma znaczenie dla kompilatora MS C++ w tym przykładzie?
błędu C2782: „
bool contains(const T &,const std::initializer_list<T2>
&)
”: parametr szablonu „T
” jest niejednoznaczne oświadczenia znajduje się od „contains
” może być „const wchar_t *
” lub „std::wstring
”
Uważa jednak skompilować i działać, jeśli kolejność parametrów szablonu jest podawany jako
template<typename T2, typename T>
Czy to błąd kompilatora?
#include <string>
#include <iostream>
#include <set>
#include <initializer_list>
#include <algorithm>
template<typename T, typename T2>
bool contains(T const& value, std::initializer_list<T2> const& set)
{
return std::find(std::begin(set), std::end(set), value) != std::end(set);
}
int main(void)
{
std::set<std::wstring> values = { L"bar", L"not" };
for (std::wstring val : values) {
std::wcout << "\"" << val << "\" ";
if (contains(val, { L"foo", L"bar", L"baz", L"doom" })) {
std::wcout << "found" << std::endl;
}
else {
std::wcout << "not found" << std::endl;
}
}
}
Edit: I stworzyli wypełnienie i wysłanie: https://connect.microsoft.com/VisualStudio/feedbackdetail/view/982338/template-parameter-order-matters
Yikes, nie mam nic przeciwko temu ... –
Nie ma sensu ... to znaczy jest błąd :) – jrok
FWIW to _will_ compile, jeśli jawnie określisz drugi argument przekazany jako 'std :: initializer_list < std :: wstring> {...} '. –