C++ compiler does not check if a method exists in template classStoring C++ template function definitions in a .CPP fileUse 'class' or 'typename' for template parameters?Is it possible to write a template to check for a function's existence?Why does C++ compilation take so long?Difference of keywords 'typename' and 'class' in templates?C++ template typedefC++11 introduced a standardized memory model. What does it mean? And how is it going to affect C++ programming?“Undefined reference to” template class constructorC++ Basic Template Class CompilationC++ Abstract Base Template Class Non-Void Method

Horror film with a pregnant woman strapped to a bed and creatures that don't like light

Gory anime with pink haired girl escaping an asylum

How to deal with a Murder Hobo Paladin?

Is this car delivery via Ebay Motors on Craigslist a scam?

Attach a visible light telescope to the outside of the ISS

My professor has told me he will be the corresponding author. Will it hurt my future career?

What is the maximum amount of diamond in one Minecraft game?

Array or vector? Two dimensional array or matrix?

Is it acceptable that I plot a time-series figure with years increasing from right to left?

Possibility to correct pitch from digital versions of records with the hole not centered

PhD: When to quit and move on?

Wearing special clothes in public while in niddah- isn't this a lack of tznius?

Initializing variables in an "if" statement

Howto display unicode character u2026 in terminal mode in emacs

Why does "sattsehen" take accusative "mich", not dative "mir"? Even though it is not "me" that I'm looking at?

Why do Martians have to wear space helmets?

Can I Ready an attack action to trigger when the target Blinks back to the Material plane?

Groups where no elements commute except for the trivial cases

Is reasonable to assume that the 食 in 月食/日食 can be interpreted as the sun/moon being "eaten" during an eclipse?

How important is it for multiple POVs to run chronologically?

What's the big deal about the Nazgûl losing their horses?

Legendre's relation for Elliptic Functions not satisfied in Mathematica?

Why do people prefer metropolitan areas, considering monsters and villains?

Machine Learning Golf: Multiplication



C++ compiler does not check if a method exists in template class


Storing C++ template function definitions in a .CPP fileUse 'class' or 'typename' for template parameters?Is it possible to write a template to check for a function's existence?Why does C++ compilation take so long?Difference of keywords 'typename' and 'class' in templates?C++ template typedefC++11 introduced a standardized memory model. What does it mean? And how is it going to affect C++ programming?“Undefined reference to” template class constructorC++ Basic Template Class CompilationC++ Abstract Base Template Class Non-Void Method






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








6















I came across with the following program in C++:



template <class T>
class Val
protected:
T x0, x;
public:
Val(T t = 1) : x0(t), x(1)
T val() return x;
void promote() this->promote_value();
;


For some reason Val<int>(4).val(); works fine even though there is no method promote_value(). I tried to remove the templates:



class OtherVal 
protected:
int x0, x;
public:
OtherVal (int t = 1) : x0(t), x(1)
int val() return x;
void promote() this->promote_value();
;


But now I get an error:




error: ‘class OtherVal’ has no member named ‘promote_value’; did you mean ‘promote’?




Why does C++ behave like this?










share|improve this question






























    6















    I came across with the following program in C++:



    template <class T>
    class Val
    protected:
    T x0, x;
    public:
    Val(T t = 1) : x0(t), x(1)
    T val() return x;
    void promote() this->promote_value();
    ;


    For some reason Val<int>(4).val(); works fine even though there is no method promote_value(). I tried to remove the templates:



    class OtherVal 
    protected:
    int x0, x;
    public:
    OtherVal (int t = 1) : x0(t), x(1)
    int val() return x;
    void promote() this->promote_value();
    ;


    But now I get an error:




    error: ‘class OtherVal’ has no member named ‘promote_value’; did you mean ‘promote’?




    Why does C++ behave like this?










    share|improve this question


























      6












      6








      6


      0






      I came across with the following program in C++:



      template <class T>
      class Val
      protected:
      T x0, x;
      public:
      Val(T t = 1) : x0(t), x(1)
      T val() return x;
      void promote() this->promote_value();
      ;


      For some reason Val<int>(4).val(); works fine even though there is no method promote_value(). I tried to remove the templates:



      class OtherVal 
      protected:
      int x0, x;
      public:
      OtherVal (int t = 1) : x0(t), x(1)
      int val() return x;
      void promote() this->promote_value();
      ;


      But now I get an error:




      error: ‘class OtherVal’ has no member named ‘promote_value’; did you mean ‘promote’?




      Why does C++ behave like this?










      share|improve this question
















      I came across with the following program in C++:



      template <class T>
      class Val
      protected:
      T x0, x;
      public:
      Val(T t = 1) : x0(t), x(1)
      T val() return x;
      void promote() this->promote_value();
      ;


      For some reason Val<int>(4).val(); works fine even though there is no method promote_value(). I tried to remove the templates:



      class OtherVal 
      protected:
      int x0, x;
      public:
      OtherVal (int t = 1) : x0(t), x(1)
      int val() return x;
      void promote() this->promote_value();
      ;


      But now I get an error:




      error: ‘class OtherVal’ has no member named ‘promote_value’; did you mean ‘promote’?




      Why does C++ behave like this?







      c++ templates






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 7 hours ago









      Gašper Čefarin

      508 bronze badges




      508 bronze badges










      asked 8 hours ago









      vesiivesii

      3831 silver badge12 bronze badges




      3831 silver badge12 bronze badges






















          2 Answers
          2






          active

          oldest

          votes


















          7














          Template class methods are not instantiated until they are used. Once you try calling promote() or even get its address like this &Val<int>::promote then you'll get an error.



          From the C++ standard:




          § 17.8.1.10 An implementation shall not implicitly instantiate a function
          template, a variable template, a member template, a non-virtual member
          function, a member class, a static data member of a class template,
          or a substatement of a constexpr if statement (9.4.1), unless such
          instantiation is required.







          share|improve this answer

























          • Thank you. Are there any checks at all that the compiler does on promote()? I guess syntax errors.

            – vesii
            8 hours ago











          • @vesil, AFAIK the compiler is obligated by the standard to parse the non-instantiated method definition and check it for correctness as much as it can without knowing the T. However the MSVC is known for violating that requirement and not bothering to check anything thus allowing a complete nonsense in method definition which will only be discovered when the method is actually used.

            – r3mus n0x
            8 hours ago












          • @vesil, the nonsense example: godbolt.org/z/q0Xvvz :)

            – r3mus n0x
            8 hours ago












          • So if the method promote() is virtual it will fail in compilation?

            – vesii
            3 hours ago



















          5














          Templates have always worked this way, principally to facilitate their use.



          Because Val<int>(4).val(); doesn't call promote, that function is not compiled for your particular instantiation of that template so the compiler does not issue a diagnostic.



          Many metaprogramming techniques depend on this behaviour.






          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%2f56891571%2fc-compiler-does-not-check-if-a-method-exists-in-template-class%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









            7














            Template class methods are not instantiated until they are used. Once you try calling promote() or even get its address like this &Val<int>::promote then you'll get an error.



            From the C++ standard:




            § 17.8.1.10 An implementation shall not implicitly instantiate a function
            template, a variable template, a member template, a non-virtual member
            function, a member class, a static data member of a class template,
            or a substatement of a constexpr if statement (9.4.1), unless such
            instantiation is required.







            share|improve this answer

























            • Thank you. Are there any checks at all that the compiler does on promote()? I guess syntax errors.

              – vesii
              8 hours ago











            • @vesil, AFAIK the compiler is obligated by the standard to parse the non-instantiated method definition and check it for correctness as much as it can without knowing the T. However the MSVC is known for violating that requirement and not bothering to check anything thus allowing a complete nonsense in method definition which will only be discovered when the method is actually used.

              – r3mus n0x
              8 hours ago












            • @vesil, the nonsense example: godbolt.org/z/q0Xvvz :)

              – r3mus n0x
              8 hours ago












            • So if the method promote() is virtual it will fail in compilation?

              – vesii
              3 hours ago
















            7














            Template class methods are not instantiated until they are used. Once you try calling promote() or even get its address like this &Val<int>::promote then you'll get an error.



            From the C++ standard:




            § 17.8.1.10 An implementation shall not implicitly instantiate a function
            template, a variable template, a member template, a non-virtual member
            function, a member class, a static data member of a class template,
            or a substatement of a constexpr if statement (9.4.1), unless such
            instantiation is required.







            share|improve this answer

























            • Thank you. Are there any checks at all that the compiler does on promote()? I guess syntax errors.

              – vesii
              8 hours ago











            • @vesil, AFAIK the compiler is obligated by the standard to parse the non-instantiated method definition and check it for correctness as much as it can without knowing the T. However the MSVC is known for violating that requirement and not bothering to check anything thus allowing a complete nonsense in method definition which will only be discovered when the method is actually used.

              – r3mus n0x
              8 hours ago












            • @vesil, the nonsense example: godbolt.org/z/q0Xvvz :)

              – r3mus n0x
              8 hours ago












            • So if the method promote() is virtual it will fail in compilation?

              – vesii
              3 hours ago














            7












            7








            7







            Template class methods are not instantiated until they are used. Once you try calling promote() or even get its address like this &Val<int>::promote then you'll get an error.



            From the C++ standard:




            § 17.8.1.10 An implementation shall not implicitly instantiate a function
            template, a variable template, a member template, a non-virtual member
            function, a member class, a static data member of a class template,
            or a substatement of a constexpr if statement (9.4.1), unless such
            instantiation is required.







            share|improve this answer















            Template class methods are not instantiated until they are used. Once you try calling promote() or even get its address like this &Val<int>::promote then you'll get an error.



            From the C++ standard:




            § 17.8.1.10 An implementation shall not implicitly instantiate a function
            template, a variable template, a member template, a non-virtual member
            function, a member class, a static data member of a class template,
            or a substatement of a constexpr if statement (9.4.1), unless such
            instantiation is required.








            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited 6 hours ago









            alter igel

            4,2651 gold badge14 silver badges33 bronze badges




            4,2651 gold badge14 silver badges33 bronze badges










            answered 8 hours ago









            r3mus n0xr3mus n0x

            3,7221 gold badge3 silver badges25 bronze badges




            3,7221 gold badge3 silver badges25 bronze badges












            • Thank you. Are there any checks at all that the compiler does on promote()? I guess syntax errors.

              – vesii
              8 hours ago











            • @vesil, AFAIK the compiler is obligated by the standard to parse the non-instantiated method definition and check it for correctness as much as it can without knowing the T. However the MSVC is known for violating that requirement and not bothering to check anything thus allowing a complete nonsense in method definition which will only be discovered when the method is actually used.

              – r3mus n0x
              8 hours ago












            • @vesil, the nonsense example: godbolt.org/z/q0Xvvz :)

              – r3mus n0x
              8 hours ago












            • So if the method promote() is virtual it will fail in compilation?

              – vesii
              3 hours ago


















            • Thank you. Are there any checks at all that the compiler does on promote()? I guess syntax errors.

              – vesii
              8 hours ago











            • @vesil, AFAIK the compiler is obligated by the standard to parse the non-instantiated method definition and check it for correctness as much as it can without knowing the T. However the MSVC is known for violating that requirement and not bothering to check anything thus allowing a complete nonsense in method definition which will only be discovered when the method is actually used.

              – r3mus n0x
              8 hours ago












            • @vesil, the nonsense example: godbolt.org/z/q0Xvvz :)

              – r3mus n0x
              8 hours ago












            • So if the method promote() is virtual it will fail in compilation?

              – vesii
              3 hours ago

















            Thank you. Are there any checks at all that the compiler does on promote()? I guess syntax errors.

            – vesii
            8 hours ago





            Thank you. Are there any checks at all that the compiler does on promote()? I guess syntax errors.

            – vesii
            8 hours ago













            @vesil, AFAIK the compiler is obligated by the standard to parse the non-instantiated method definition and check it for correctness as much as it can without knowing the T. However the MSVC is known for violating that requirement and not bothering to check anything thus allowing a complete nonsense in method definition which will only be discovered when the method is actually used.

            – r3mus n0x
            8 hours ago






            @vesil, AFAIK the compiler is obligated by the standard to parse the non-instantiated method definition and check it for correctness as much as it can without knowing the T. However the MSVC is known for violating that requirement and not bothering to check anything thus allowing a complete nonsense in method definition which will only be discovered when the method is actually used.

            – r3mus n0x
            8 hours ago














            @vesil, the nonsense example: godbolt.org/z/q0Xvvz :)

            – r3mus n0x
            8 hours ago






            @vesil, the nonsense example: godbolt.org/z/q0Xvvz :)

            – r3mus n0x
            8 hours ago














            So if the method promote() is virtual it will fail in compilation?

            – vesii
            3 hours ago






            So if the method promote() is virtual it will fail in compilation?

            – vesii
            3 hours ago














            5














            Templates have always worked this way, principally to facilitate their use.



            Because Val<int>(4).val(); doesn't call promote, that function is not compiled for your particular instantiation of that template so the compiler does not issue a diagnostic.



            Many metaprogramming techniques depend on this behaviour.






            share|improve this answer



























              5














              Templates have always worked this way, principally to facilitate their use.



              Because Val<int>(4).val(); doesn't call promote, that function is not compiled for your particular instantiation of that template so the compiler does not issue a diagnostic.



              Many metaprogramming techniques depend on this behaviour.






              share|improve this answer

























                5












                5








                5







                Templates have always worked this way, principally to facilitate their use.



                Because Val<int>(4).val(); doesn't call promote, that function is not compiled for your particular instantiation of that template so the compiler does not issue a diagnostic.



                Many metaprogramming techniques depend on this behaviour.






                share|improve this answer













                Templates have always worked this way, principally to facilitate their use.



                Because Val<int>(4).val(); doesn't call promote, that function is not compiled for your particular instantiation of that template so the compiler does not issue a diagnostic.



                Many metaprogramming techniques depend on this behaviour.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered 8 hours ago









                BathshebaBathsheba

                189k27 gold badges282 silver badges400 bronze badges




                189k27 gold badges282 silver badges400 bronze badges



























                    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%2f56891571%2fc-compiler-does-not-check-if-a-method-exists-in-template-class%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

                    Invision Community Contents History See also References External links Navigation menuProprietaryinvisioncommunity.comIPS Community ForumsIPS Community Forumsthis blog entry"License Changes, IP.Board 3.4, and the Future""Interview -- Matt Mecham of Ibforums""CEO Invision Power Board, Matt Mecham Is a Liar, Thief!"IPB License Explanation 1.3, 1.3.1, 2.0, and 2.1ArchivedSecurity Fixes, Updates And Enhancements For IPB 1.3.1Archived"New Demo Accounts - Invision Power Services"the original"New Default Skin"the original"Invision Power Board 3.0.0 and Applications Released"the original"Archived copy"the original"Perpetual licenses being done away with""Release Notes - Invision Power Services""Introducing: IPS Community Suite 4!"Invision Community Release Notes

                    Canceling a color specificationRandomly assigning color to Graphics3D objects?Default color for Filling in Mathematica 9Coloring specific elements of sets with a prime modified order in an array plotHow to pick a color differing significantly from the colors already in a given color list?Detection of the text colorColor numbers based on their valueCan color schemes for use with ColorData include opacity specification?My dynamic color schemes

                    Ласкавець круглолистий Зміст Опис | Поширення | Галерея | Примітки | Посилання | Навігаційне меню58171138361-22960890446Bupleurum rotundifoliumEuro+Med PlantbasePlants of the World Online — Kew ScienceGermplasm Resources Information Network (GRIN)Ласкавецькн. VI : Літери Ком — Левиправивши або дописавши її