Default template parameter with class
I've just found out about a strange syntax for default template parameters
template<class T = class Z>
struct X
{};
What does the second "class" keyword mean in this context?
c++ templates default-value
add a comment |
I've just found out about a strange syntax for default template parameters
template<class T = class Z>
struct X
{};
What does the second "class" keyword mean in this context?
c++ templates default-value
add a comment |
I've just found out about a strange syntax for default template parameters
template<class T = class Z>
struct X
{};
What does the second "class" keyword mean in this context?
c++ templates default-value
I've just found out about a strange syntax for default template parameters
template<class T = class Z>
struct X
{};
What does the second "class" keyword mean in this context?
c++ templates default-value
c++ templates default-value
asked yesterday
DunsDuns
855
855
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
It's nothing special really. C++ allows you to refer to a class via an elaborated type specifier. E.g.
void foo(class bar*);
This declares a function foo
that accepts an argument of the type bar*
. If bar
was not declared previously, this elaborate type specifier constitutes a declaration of bar
in the namespace containing foo
. I.e. as if you had written:
class bar;
void foo(bar*);
Back to your example, X
is a class template that expects a single type parameter, denoted by class T
, but could have been denoted just the same as typename T
. Said type parameter has a default argument, named by the elaborated class specifier class Z
. That declaration can be rewritten just like the function above:
class Z;
template<class T = Z>
struct X
{};
great explanation, thank you very much
– Duns
yesterday
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%2f54388402%2fdefault-template-parameter-with-class%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
It's nothing special really. C++ allows you to refer to a class via an elaborated type specifier. E.g.
void foo(class bar*);
This declares a function foo
that accepts an argument of the type bar*
. If bar
was not declared previously, this elaborate type specifier constitutes a declaration of bar
in the namespace containing foo
. I.e. as if you had written:
class bar;
void foo(bar*);
Back to your example, X
is a class template that expects a single type parameter, denoted by class T
, but could have been denoted just the same as typename T
. Said type parameter has a default argument, named by the elaborated class specifier class Z
. That declaration can be rewritten just like the function above:
class Z;
template<class T = Z>
struct X
{};
great explanation, thank you very much
– Duns
yesterday
add a comment |
It's nothing special really. C++ allows you to refer to a class via an elaborated type specifier. E.g.
void foo(class bar*);
This declares a function foo
that accepts an argument of the type bar*
. If bar
was not declared previously, this elaborate type specifier constitutes a declaration of bar
in the namespace containing foo
. I.e. as if you had written:
class bar;
void foo(bar*);
Back to your example, X
is a class template that expects a single type parameter, denoted by class T
, but could have been denoted just the same as typename T
. Said type parameter has a default argument, named by the elaborated class specifier class Z
. That declaration can be rewritten just like the function above:
class Z;
template<class T = Z>
struct X
{};
great explanation, thank you very much
– Duns
yesterday
add a comment |
It's nothing special really. C++ allows you to refer to a class via an elaborated type specifier. E.g.
void foo(class bar*);
This declares a function foo
that accepts an argument of the type bar*
. If bar
was not declared previously, this elaborate type specifier constitutes a declaration of bar
in the namespace containing foo
. I.e. as if you had written:
class bar;
void foo(bar*);
Back to your example, X
is a class template that expects a single type parameter, denoted by class T
, but could have been denoted just the same as typename T
. Said type parameter has a default argument, named by the elaborated class specifier class Z
. That declaration can be rewritten just like the function above:
class Z;
template<class T = Z>
struct X
{};
It's nothing special really. C++ allows you to refer to a class via an elaborated type specifier. E.g.
void foo(class bar*);
This declares a function foo
that accepts an argument of the type bar*
. If bar
was not declared previously, this elaborate type specifier constitutes a declaration of bar
in the namespace containing foo
. I.e. as if you had written:
class bar;
void foo(bar*);
Back to your example, X
is a class template that expects a single type parameter, denoted by class T
, but could have been denoted just the same as typename T
. Said type parameter has a default argument, named by the elaborated class specifier class Z
. That declaration can be rewritten just like the function above:
class Z;
template<class T = Z>
struct X
{};
answered yesterday
StoryTellerStoryTeller
96.9k12197263
96.9k12197263
great explanation, thank you very much
– Duns
yesterday
add a comment |
great explanation, thank you very much
– Duns
yesterday
great explanation, thank you very much
– Duns
yesterday
great explanation, thank you very much
– Duns
yesterday
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%2f54388402%2fdefault-template-parameter-with-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