【发布时间】:2014-11-21 12:16:58
【问题描述】:
以下代码在 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
【问题讨论】:
-
哎呀,我不参加这个...
-
毫无意义......即这是一个错误:)
-
FWIW 如果您明确指定传递为
std::initializer_list<std::wstring>{ ... }的第二个参数,此将编译。 -
这里改变模板参数的顺序相当于改变函数形式参数的顺序,加上调用中实际参数的顺序。没关系。因此这是一个错误。您可以通过 (connect.microsoft.com/visualstudio) 举报。
-
@Cheersandhth.-Alf 你确定吗?由于 T 和 T2 的使用方式不同,我发现这违反直觉,但我可能不知道您使用的“形式参数”的定义。
标签: c++ templates visual-c++ c++11