代码之家  ›  专栏  ›  技术社区  ›  Hind Forsum

c++11可变模板无法编译

  •  2
  • Hind Forsum  · 技术社区  · 7 年前

    #include <cstddef>
    #include <utility>
    using namespace std;
    template<class T>
    size_t f(T&& ... elem){
        return sizeof...(elem);
    }
    int main(){
        return 0;
    }
    

    但它无法编译

    main.cpp:5:22: error: expansion pattern 'T&&' contains no argument packs
    size_t count(T&& ... elem){
                        ^~~~
    main.cpp: In function 'size_t count()':
    main.cpp:6:22: error: 'elem' has not been declared
        return sizeof...(elem);
                        ^~~~
    main.cpp: In function 'int main()':
    main.cpp:9:23: error: no matching function for call to 'count(int, int, int)'
        return count(1,2,3);
                        ^
    main.cpp:5:8: note: candidate: 'template<class T> size_t count()'
    size_t count(T&& ... elem){
            ^~~~~
    main.cpp:5:8: note:   template argument deduction/substitution failed:
    main.cpp:9:23: note:   candidate expects 0 arguments, 3 provided
        return count(1,2,3);
                        ^
    
    
    g++ -std=c++17 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
    Compile, link and run...
    Share!
    

    如何修复它?

    1 回复  |  直到 7 年前
        1
  •  5
  •   Kerrek SB    7 年前

    您需要引入模板参数包 ... ,也是:

    template<class... T>         // declares the pack "T"
    //            ^^^
    size_t f(T&&... elem)        // declares the pack "elem", uses the pack "T"
    {
        return sizeof...(elem);  // ("sizeof..." is an operator)
    }