Trailing class template arguments not deduced

后端 未结 1 535
花落未央
花落未央 2020-12-17 16:11

The code below fails to compile with gcc 7.1.0, which complains about providing the wrong number of template arguments in the second line of main. This version of GCC is sup

相关标签:
1条回答
  • 2020-12-17 16:55

    This is expected behavior; unlike template argument deduction (for function templates), class template argument deduction (since C++17) only works when no template arguments are provided.

    Class template argument deduction is only performed if no template arguments are provided. If at least one argument is specified, deduction does not take place.

    std::tuple t(1, 2, 3);              // OK: deduction
    std::tuple<int,int,int> t(1, 2, 3); // OK: all arguments are provided
    std::tuple<int> t(1, 2, 3);         // Error: partial deduction
    

    That means for your example you can't take advantage of class template argument deduction and have to specify all the template arguments. If you want class template argument deduction taking effect you have to specify none, but the template parameter T1 can't be deduced.

    On the other hand, the following code would work.

    template <typename T1, typename T2>
    struct Bar {
        Bar(T1, T2) {}   // make it possible to deduce T1
    };
    
    int main(int argc, char **argv) {
        Bar bar(42, 42); // take advantage of class template argument deduction
    }
    
    0 讨论(0)
提交回复
热议问题