我有这个代码:
#include <iostream>
#include <vector>
template<typename T>
void print_size(std::vector<T> a)
{
std::cout << a.size() << '\n';
}
int main()
{
std::vector<int> v {1, 2, 3};
print_size(v);
auto w = {1, 2, 3};
// print_size(w); // error: no matching function for call to 'print_size'
// candidate template ignored: could not match 'vector' against 'initializer_list'
}
...可以编译并运行,没有任何问题。但是,如果启用注释行,则会产生错误no matching function for call to 'print_size'
。
我想知道在C ++ 11和更高版本中编写此代码的正确方法是什么。
对于willauto w = {1, 2, 3};
的类型,由于无法推断出模板参数而失败;模板参数推导不考虑隐式转换。w
std::initializer_list<int>
print_size(w);
T
类型推导不考虑隐式转换(上面列出的类型调整除外):这是超载解析的工作,稍后会发生。
您可以显式指定模板参数,
print_size<int>(w);
或者你可以w
成为一个std::vector<int>
替代者。如果您坚持使用auto
,则需要明确指定类型。
auto w = std::vector<int>{1, 2, 3};
print_size(w);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句