Why can't this initializer-list match to a template argument?












3















#include <iostream>

class Foo
{
public:

template <typename Container>
Foo (const Container & args)
{
for (auto arg : args)
std::cout << "ARG(" << arg << ")n";
}
};

int main ()
{
Foo foo ({"foo", "bar", "baz"});
}


The error (using g++ -std=c++17) is



error: no matching function for call to ‘Foo::Foo(<brace-enclosed initializer list>)’


This works



Foo foo (std::vector<const char*> ({"foo", "bar", "baz"}));


Why can't the initializer-list match the template constructor?










share|improve this question





























    3















    #include <iostream>

    class Foo
    {
    public:

    template <typename Container>
    Foo (const Container & args)
    {
    for (auto arg : args)
    std::cout << "ARG(" << arg << ")n";
    }
    };

    int main ()
    {
    Foo foo ({"foo", "bar", "baz"});
    }


    The error (using g++ -std=c++17) is



    error: no matching function for call to ‘Foo::Foo(<brace-enclosed initializer list>)’


    This works



    Foo foo (std::vector<const char*> ({"foo", "bar", "baz"}));


    Why can't the initializer-list match the template constructor?










    share|improve this question



























      3












      3








      3


      1






      #include <iostream>

      class Foo
      {
      public:

      template <typename Container>
      Foo (const Container & args)
      {
      for (auto arg : args)
      std::cout << "ARG(" << arg << ")n";
      }
      };

      int main ()
      {
      Foo foo ({"foo", "bar", "baz"});
      }


      The error (using g++ -std=c++17) is



      error: no matching function for call to ‘Foo::Foo(<brace-enclosed initializer list>)’


      This works



      Foo foo (std::vector<const char*> ({"foo", "bar", "baz"}));


      Why can't the initializer-list match the template constructor?










      share|improve this question
















      #include <iostream>

      class Foo
      {
      public:

      template <typename Container>
      Foo (const Container & args)
      {
      for (auto arg : args)
      std::cout << "ARG(" << arg << ")n";
      }
      };

      int main ()
      {
      Foo foo ({"foo", "bar", "baz"});
      }


      The error (using g++ -std=c++17) is



      error: no matching function for call to ‘Foo::Foo(<brace-enclosed initializer list>)’


      This works



      Foo foo (std::vector<const char*> ({"foo", "bar", "baz"}));


      Why can't the initializer-list match the template constructor?







      c++ templates c++17 initializer-list template-deduction






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 7 '18 at 11:02









      max66

      36.8k74166




      36.8k74166










      asked Nov 7 '18 at 10:29









      spraffspraff

      17.9k1486165




      17.9k1486165
























          2 Answers
          2






          active

          oldest

          votes


















          4














          {"foo", "bar", "baz"} has no type, so it cannot be deduced for



          template <typename Container>
          Foo (const Container&);


          You can only use it for deduction for



          template <typename T>
          Foo (const std::initializer_list<T>&);





          share|improve this answer

































            1














            As explained by Jarod42, {"foo", "bar", "baz"} has no type, so it cannot be deduced for template <typename Container> Foo (const Container&).



            Another possible solution is



            template <typename T, std::size_t N>
            Foo (T const (& arr)[N])
            {
            for (auto arg : arr)
            std::cout << "ARG(" << arg << ")n";
            }


            so {"foo", "bar", "baz"} is deduced as an initialization list for a C-style array with the correct size (3).






            share|improve this answer

























              Your Answer






              StackExchange.ifUsing("editor", function () {
              StackExchange.using("externalEditor", function () {
              StackExchange.using("snippets", function () {
              StackExchange.snippets.init();
              });
              });
              }, "code-snippets");

              StackExchange.ready(function() {
              var channelOptions = {
              tags: "".split(" "),
              id: "1"
              };
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function() {
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled) {
              StackExchange.using("snippets", function() {
              createEditor();
              });
              }
              else {
              createEditor();
              }
              });

              function createEditor() {
              StackExchange.prepareEditor({
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: true,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: 10,
              bindNavPrevention: true,
              postfix: "",
              imageUploader: {
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              },
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              });


              }
              });














              draft saved

              draft discarded


















              StackExchange.ready(
              function () {
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53187640%2fwhy-cant-this-initializer-list-match-to-a-template-argument%23new-answer', 'question_page');
              }
              );

              Post as a guest















              Required, but never shown

























              2 Answers
              2






              active

              oldest

              votes








              2 Answers
              2






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              4














              {"foo", "bar", "baz"} has no type, so it cannot be deduced for



              template <typename Container>
              Foo (const Container&);


              You can only use it for deduction for



              template <typename T>
              Foo (const std::initializer_list<T>&);





              share|improve this answer






























                4














                {"foo", "bar", "baz"} has no type, so it cannot be deduced for



                template <typename Container>
                Foo (const Container&);


                You can only use it for deduction for



                template <typename T>
                Foo (const std::initializer_list<T>&);





                share|improve this answer




























                  4












                  4








                  4







                  {"foo", "bar", "baz"} has no type, so it cannot be deduced for



                  template <typename Container>
                  Foo (const Container&);


                  You can only use it for deduction for



                  template <typename T>
                  Foo (const std::initializer_list<T>&);





                  share|improve this answer















                  {"foo", "bar", "baz"} has no type, so it cannot be deduced for



                  template <typename Container>
                  Foo (const Container&);


                  You can only use it for deduction for



                  template <typename T>
                  Foo (const std::initializer_list<T>&);






                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Nov 23 '18 at 20:00









                  Peter Mortensen

                  13.7k1986111




                  13.7k1986111










                  answered Nov 7 '18 at 10:32









                  Jarod42Jarod42

                  117k12103185




                  117k12103185

























                      1














                      As explained by Jarod42, {"foo", "bar", "baz"} has no type, so it cannot be deduced for template <typename Container> Foo (const Container&).



                      Another possible solution is



                      template <typename T, std::size_t N>
                      Foo (T const (& arr)[N])
                      {
                      for (auto arg : arr)
                      std::cout << "ARG(" << arg << ")n";
                      }


                      so {"foo", "bar", "baz"} is deduced as an initialization list for a C-style array with the correct size (3).






                      share|improve this answer






























                        1














                        As explained by Jarod42, {"foo", "bar", "baz"} has no type, so it cannot be deduced for template <typename Container> Foo (const Container&).



                        Another possible solution is



                        template <typename T, std::size_t N>
                        Foo (T const (& arr)[N])
                        {
                        for (auto arg : arr)
                        std::cout << "ARG(" << arg << ")n";
                        }


                        so {"foo", "bar", "baz"} is deduced as an initialization list for a C-style array with the correct size (3).






                        share|improve this answer




























                          1












                          1








                          1







                          As explained by Jarod42, {"foo", "bar", "baz"} has no type, so it cannot be deduced for template <typename Container> Foo (const Container&).



                          Another possible solution is



                          template <typename T, std::size_t N>
                          Foo (T const (& arr)[N])
                          {
                          for (auto arg : arr)
                          std::cout << "ARG(" << arg << ")n";
                          }


                          so {"foo", "bar", "baz"} is deduced as an initialization list for a C-style array with the correct size (3).






                          share|improve this answer















                          As explained by Jarod42, {"foo", "bar", "baz"} has no type, so it cannot be deduced for template <typename Container> Foo (const Container&).



                          Another possible solution is



                          template <typename T, std::size_t N>
                          Foo (T const (& arr)[N])
                          {
                          for (auto arg : arr)
                          std::cout << "ARG(" << arg << ")n";
                          }


                          so {"foo", "bar", "baz"} is deduced as an initialization list for a C-style array with the correct size (3).







                          share|improve this answer














                          share|improve this answer



                          share|improve this answer








                          edited Nov 23 '18 at 20:00









                          Peter Mortensen

                          13.7k1986111




                          13.7k1986111










                          answered Nov 7 '18 at 11:01









                          max66max66

                          36.8k74166




                          36.8k74166






























                              draft saved

                              draft discarded




















































                              Thanks for contributing an answer to Stack Overflow!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid



                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.


                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function () {
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53187640%2fwhy-cant-this-initializer-list-match-to-a-template-argument%23new-answer', 'question_page');
                              }
                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              Costa Masnaga

                              Fotorealismo

                              Sidney Franklin