我有这个代码:
#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 及更高版本中编写此代码的正确方法是什么。
For auto w = {1, 2, 3};
的类型w
将std::initializer_list<int>
, and print_size(w);
失败,因为模板参数T
无法推论;模板实参推导 http://en.cppreference.com/w/cpp/language/template_argument_deduction#Implicit_conversions不考虑隐式转换。
类型推导不考虑隐式转换(除了上面列出的类型调整之外):这是重载解析的工作,稍后发生。
您可以显式指定模板参数,
print_size<int>(w);
或者你可以做w
成为一个std::vector<int>
反而;如果你坚持使用auto
您需要明确指定类型。
auto w = std::vector<int>{1, 2, 3};
print_size(w);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)