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);失败,因为无法推导模板参数Ttemplate 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);