C++ C++;错误:对';的调用没有匹配函数;打印尺寸';
我有以下代码:C++ C++;错误:对';的调用没有匹配函数;打印尺寸';,c++,c++11,initializer-list,auto,C++,C++11,Initializer List,Auto,我有以下代码: #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);
#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'
}
#包括
#包括
模板
无效打印尺寸(标准::矢量a)
{
std::cout铸造w将是一种解决方案
print_size((std::vector<int>)w);
打印尺寸((标准::矢量)w);
如果没有C++17演绎指南,编译器无法从类型为std::initializer\u list
的参数中为std::vector
推断T
我建议为print\u size(std::initializer\u list const&)添加一个重载
问题是print\u size的参数类型
。
您的auto w={1,2,3};
具有类型std::initializer\u list
,并且这与向量不匹配,因此没有自动转换
因此,您可以通过以下方式更正打印尺寸
:
template<class T>
void print_size(std::initializer_list<T> a)
{
std::cout << a.size() << '\n';
}
模板
无效打印大小(标准::初始值设定项列表a)
{
STD::CUT< P> >代码> AutoW= { 1, 2, 3 }; <代码> W >将是<代码> STD::IngaliSeriSList,和<代码> PrimtJosig(W); >由于模板参数<代码> t>代码>无法推断;不考虑隐式转换。
类型推导不考虑隐式转换(除了上面列出的类型调整):这是超载分辨率的工作,稍后会发生。
可以显式指定模板参数
print_size<int>(w);
`由于C++11,我们应该尝试在任何地方使用auto`-no.AAA是一个糟糕的主意。C++11中正确且惯用的方法是std::vector w{1,2,3};
和std::vector w{1,2,3}
在C++17中。对于AAA,auto w=std::vector{1,2,3}
…您的自动w
被自动识别为初始值设定项列表
,这是合理的。您不能期望编译器将其识别为std::vector
,因为{x,x,x}
不一定是向量
(可能是任何类型的容器或原始数组)而且x
不一定是int
。为什么提供一个不起作用的代码并要求一种方法来修复它是基于意见的?我相信最多会有两到三种方法来修复它。如果这两到三种方法被记录在一个答案中,它应该是一个客观的答案。cast只会调用构造函数,所以usin相反,gstd::vector{w}
将更直接。
print_size<int>(w);
auto w = std::vector<int>{1, 2, 3};
print_size(w);