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;
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
add a comment |
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
add a comment |
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
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
c++ templates
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
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
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.
Thank you. Are there any checks at all that the compiler does onpromote()
? 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 theT
. 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 methodpromote()
is virtual it will fail in compilation?
– vesii
3 hours ago
add a comment |
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.
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
Thank you. Are there any checks at all that the compiler does onpromote()
? 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 theT
. 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 methodpromote()
is virtual it will fail in compilation?
– vesii
3 hours ago
add a comment |
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.
Thank you. Are there any checks at all that the compiler does onpromote()
? 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 theT
. 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 methodpromote()
is virtual it will fail in compilation?
– vesii
3 hours ago
add a comment |
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.
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.
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 onpromote()
? 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 theT
. 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 methodpromote()
is virtual it will fail in compilation?
– vesii
3 hours ago
add a comment |
Thank you. Are there any checks at all that the compiler does onpromote()
? 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 theT
. 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 methodpromote()
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
add a comment |
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.
add a comment |
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.
add a comment |
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.
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.
answered 8 hours ago
BathshebaBathsheba
189k27 gold badges282 silver badges400 bronze badges
189k27 gold badges282 silver badges400 bronze badges
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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