C++ error: no matching function for call to 'print_size'
C++ error: no matching function for call to '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 及更高版本中编写此代码的正确方法是什么。
铸造 w 将是一个解决方案
print_size((std::vector<int>)w);
如果没有 C++17 推导指南,编译器无法从 std::initializer_list<T>
类型的参数中为 std::vector<T>
参数推导 T
,很遗憾。
我建议为 print_size(std::initializer_list<T> const&)
添加重载。
问题是 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';
}
对于auto w = {1, 2, 3};
,w
的类型将是std::initializer_list<int>
,print_size(w);
失败,因为无法推导模板参数T
; template argument deduction 不考虑隐式转换。
Type deduction does not consider implicit conversions (other than type adjustments listed above): that's the job for overload resolution, which happens later.
您可以明确指定模板参数,
print_size<int>(w);
或者您可以将 w
改为 std::vector<int>
;如果您坚持使用 auto
,则需要明确指定类型。
auto w = std::vector<int>{1, 2, 3};
print_size(w);
我有这个代码:
#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 及更高版本中编写此代码的正确方法是什么。
铸造 w 将是一个解决方案
print_size((std::vector<int>)w);
如果没有 C++17 推导指南,编译器无法从 std::initializer_list<T>
类型的参数中为 std::vector<T>
参数推导 T
,很遗憾。
我建议为 print_size(std::initializer_list<T> const&)
添加重载。
问题是 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';
}
对于auto w = {1, 2, 3};
,w
的类型将是std::initializer_list<int>
,print_size(w);
失败,因为无法推导模板参数T
; template argument deduction 不考虑隐式转换。
Type deduction does not consider implicit conversions (other than type adjustments listed above): that's the job for overload resolution, which happens later.
您可以明确指定模板参数,
print_size<int>(w);
或者您可以将 w
改为 std::vector<int>
;如果您坚持使用 auto
,则需要明确指定类型。
auto w = std::vector<int>{1, 2, 3};
print_size(w);