以下代码在GCC中编译良好,但在Visual Studio中会导致
错误C2782:'
bool contains(const T &,const std::initializer_list<T2>
&)
':模板参数“T
”不明确请参阅声明 “contains
”可以是“const wchar_t *
”或“std::wstring
”
如果模板参数的顺序为
,则它会编译并运行 template<typename T2, typename T>
这是编译器错误吗?
#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;
}
}
}
编辑:我创建了一个错误报告:https://connect.microsoft.com/VisualStudio/feedbackdetail/view/982338/template-parameter-order-matters
答案 0 :(得分:1)
我记得VS有一个错误,他们会在某些情况下做双重演绎,我认为这是在这里发生的事情。 Clang也用两种方式编译,所以既然clang + gcc同意,它很可能是一个VS bug。
答案 1 :(得分:1)
我有一个类似的问题,通过切换到最新的VS Pro版本解决了。我认为这个错误是在最新的VS专业版中解决的,因为我记得在某些时候在更改日志中看到它。