代码之家  ›  专栏  ›  技术社区  ›  Lone Learner

C++错误:没有调用“打印大小”的匹配函数

  •  2
  • Lone Learner  · 技术社区  · 6 年前

    我有这个代码:

    #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和以后版本中编写这个代码的正确方法是什么。

    4 回复  |  直到 6 年前
        1
  •  5
  •   songyuanyao    6 年前

    为了 auto w = {1, 2, 3}; 的类型 w std::initializer_list<int> print_size(w); 失败,因为模板参数 T 无法推断; template argument deduction 不考虑隐式转换。

    类型推断不考虑隐式转换(上面列出的类型调整除外):这是重载解析的工作,稍后会发生。

    可以显式指定模板参数,

    print_size<int>(w);
    

    或者你可以 W 成为一个 std::vector<int> 如果你坚持使用 auto 需要显式指定类型。

    auto w = std::vector<int>{1, 2, 3};
    print_size(w);
    
        2
  •  2
  •   Marek R    6 年前

    参数类型有问题 print_size . 你的 auto w = {1, 2, 3}; 具有类型 std::initializer_list<int> 这个不符合 vector<T> ,没有自动转换。

    所以你可以纠正 打印尺寸 这种方式:

    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';
    }
    
        3
  •  1
  •   Maxim Egorushkin    6 年前

    没有C++ 17演绎指南,编译器就不能演绎 T 对于 std::vector<T> 参数来自类型的参数 std::initializer_list<T> ,不幸的是。

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

        4
  •  0
  •   erkut    6 年前

    铸造W将是一个解决方案

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