C++错误:调用"print_size"没有匹配函数



我有这个代码:

#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 及更高版本中编写此代码的正确方法是什么。

对于auto 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);

问题是print_size的参数类型。 您的auto w = {1, 2, 3};具有类型std::initializer_list<int>并且这与vector<T>不匹配,没有自动转换。

因此,您可以通过以下方式更正print_size

template<class T>
void print_size(std::initializer_list<T> a)
{
std::cout << a.size() << 'n';
}

甚至更好地更改模板的参数化方式:

template<class T>
void print_size(const T& a)
{
std::cout << a.size() << 'n';
}

不幸的是,如果没有C++17的演绎指南,编译器无法从类型std::vector<T>参数中推断出std::initializer_list<T>参数的T

我建议为print_size(std::initializer_list<T> const&)添加重载.

投射w将是一个解决方案

print_size((std::vector<int>)w);

相关内容

最新更新