Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;错误:对';的调用没有匹配函数;打印尺寸';_C++_C++11_Initializer List_Auto - Fatal编程技术网

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相反,g
std::vector{w}
将更直接。
print_size<int>(w);
auto w = std::vector<int>{1, 2, 3};
print_size(w);