Issue with calling static template method inside a template class
I have a template class and a static template method inside. I also have a simple function g, that just allows user to call this method in an appropriate way. This code gives me an error "expected primary-expression before '>' token" inside g function. But if I call a method inside g function like this:
return A<types::a>::f<T>();
In that case code compiles fine and gives no error. How can I possibly fix this issue and what is the problem?
enum class types : uint8_t
{
a, b
};
template<types type>
struct A {
template<typename T>
static T f();
};
template<>
template<typename T>
T A<types::a>::f() {
cout << "a" << endl;
return T{};
}
template<>
template<typename T>
T A<types::b>::f() {
cout << "b" << endl;
return T{};
}
template<types type, typename T>
T g() {
return A<type>::f<T>();
}
int main() {
g<types::a, int>();
}
c++
New contributor
add a comment |
I have a template class and a static template method inside. I also have a simple function g, that just allows user to call this method in an appropriate way. This code gives me an error "expected primary-expression before '>' token" inside g function. But if I call a method inside g function like this:
return A<types::a>::f<T>();
In that case code compiles fine and gives no error. How can I possibly fix this issue and what is the problem?
enum class types : uint8_t
{
a, b
};
template<types type>
struct A {
template<typename T>
static T f();
};
template<>
template<typename T>
T A<types::a>::f() {
cout << "a" << endl;
return T{};
}
template<>
template<typename T>
T A<types::b>::f() {
cout << "b" << endl;
return T{};
}
template<types type, typename T>
T g() {
return A<type>::f<T>();
}
int main() {
g<types::a, int>();
}
c++
New contributor
Istypes
an enum?
– Max Langhof
Jan 18 at 12:51
Yes, it's an enum. enum class types : uint8_t { a, b };
– Никита Ларионов
Jan 18 at 12:54
add a comment |
I have a template class and a static template method inside. I also have a simple function g, that just allows user to call this method in an appropriate way. This code gives me an error "expected primary-expression before '>' token" inside g function. But if I call a method inside g function like this:
return A<types::a>::f<T>();
In that case code compiles fine and gives no error. How can I possibly fix this issue and what is the problem?
enum class types : uint8_t
{
a, b
};
template<types type>
struct A {
template<typename T>
static T f();
};
template<>
template<typename T>
T A<types::a>::f() {
cout << "a" << endl;
return T{};
}
template<>
template<typename T>
T A<types::b>::f() {
cout << "b" << endl;
return T{};
}
template<types type, typename T>
T g() {
return A<type>::f<T>();
}
int main() {
g<types::a, int>();
}
c++
New contributor
I have a template class and a static template method inside. I also have a simple function g, that just allows user to call this method in an appropriate way. This code gives me an error "expected primary-expression before '>' token" inside g function. But if I call a method inside g function like this:
return A<types::a>::f<T>();
In that case code compiles fine and gives no error. How can I possibly fix this issue and what is the problem?
enum class types : uint8_t
{
a, b
};
template<types type>
struct A {
template<typename T>
static T f();
};
template<>
template<typename T>
T A<types::a>::f() {
cout << "a" << endl;
return T{};
}
template<>
template<typename T>
T A<types::b>::f() {
cout << "b" << endl;
return T{};
}
template<types type, typename T>
T g() {
return A<type>::f<T>();
}
int main() {
g<types::a, int>();
}
c++
c++
New contributor
New contributor
edited Jan 18 at 12:55
Никита Ларионов
New contributor
asked Jan 18 at 12:50
Никита ЛарионовНикита Ларионов
254
254
New contributor
New contributor
Istypes
an enum?
– Max Langhof
Jan 18 at 12:51
Yes, it's an enum. enum class types : uint8_t { a, b };
– Никита Ларионов
Jan 18 at 12:54
add a comment |
Istypes
an enum?
– Max Langhof
Jan 18 at 12:51
Yes, it's an enum. enum class types : uint8_t { a, b };
– Никита Ларионов
Jan 18 at 12:54
Is
types
an enum?– Max Langhof
Jan 18 at 12:51
Is
types
an enum?– Max Langhof
Jan 18 at 12:51
Yes, it's an enum. enum class types : uint8_t { a, b };
– Никита Ларионов
Jan 18 at 12:54
Yes, it's an enum. enum class types : uint8_t { a, b };
– Никита Ларионов
Jan 18 at 12:54
add a comment |
1 Answer
1
active
oldest
votes
You need to add a template
keyword:
template<types type, typename T>
T g() {
return A<type>::template f<T>();
}
Demo
A<type>::f
is a dependent name (depends on template parameter type
). To correctly parse this statement when the template definition is encountered (as required by two-phase-lookup rules), the compiler has to know before instantiation whether f
is a variable, a type or a template. It defaults to "it's a variable"; add template
to denote a template or typename
to denote a type.
Your other case works because in return A<types::a>::f<T>();
there is no dependent name.
Thank you. That solved my problem.
– Никита Ларионов
Jan 18 at 12:57
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
});
}
});
Никита Ларионов is a new contributor. Be nice, and check out our Code of Conduct.
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%2f54254378%2fissue-with-calling-static-template-method-inside-a-template-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
You need to add a template
keyword:
template<types type, typename T>
T g() {
return A<type>::template f<T>();
}
Demo
A<type>::f
is a dependent name (depends on template parameter type
). To correctly parse this statement when the template definition is encountered (as required by two-phase-lookup rules), the compiler has to know before instantiation whether f
is a variable, a type or a template. It defaults to "it's a variable"; add template
to denote a template or typename
to denote a type.
Your other case works because in return A<types::a>::f<T>();
there is no dependent name.
Thank you. That solved my problem.
– Никита Ларионов
Jan 18 at 12:57
add a comment |
You need to add a template
keyword:
template<types type, typename T>
T g() {
return A<type>::template f<T>();
}
Demo
A<type>::f
is a dependent name (depends on template parameter type
). To correctly parse this statement when the template definition is encountered (as required by two-phase-lookup rules), the compiler has to know before instantiation whether f
is a variable, a type or a template. It defaults to "it's a variable"; add template
to denote a template or typename
to denote a type.
Your other case works because in return A<types::a>::f<T>();
there is no dependent name.
Thank you. That solved my problem.
– Никита Ларионов
Jan 18 at 12:57
add a comment |
You need to add a template
keyword:
template<types type, typename T>
T g() {
return A<type>::template f<T>();
}
Demo
A<type>::f
is a dependent name (depends on template parameter type
). To correctly parse this statement when the template definition is encountered (as required by two-phase-lookup rules), the compiler has to know before instantiation whether f
is a variable, a type or a template. It defaults to "it's a variable"; add template
to denote a template or typename
to denote a type.
Your other case works because in return A<types::a>::f<T>();
there is no dependent name.
You need to add a template
keyword:
template<types type, typename T>
T g() {
return A<type>::template f<T>();
}
Demo
A<type>::f
is a dependent name (depends on template parameter type
). To correctly parse this statement when the template definition is encountered (as required by two-phase-lookup rules), the compiler has to know before instantiation whether f
is a variable, a type or a template. It defaults to "it's a variable"; add template
to denote a template or typename
to denote a type.
Your other case works because in return A<types::a>::f<T>();
there is no dependent name.
edited Jan 18 at 12:57
answered Jan 18 at 12:53
Max LanghofMax Langhof
9,2751537
9,2751537
Thank you. That solved my problem.
– Никита Ларионов
Jan 18 at 12:57
add a comment |
Thank you. That solved my problem.
– Никита Ларионов
Jan 18 at 12:57
Thank you. That solved my problem.
– Никита Ларионов
Jan 18 at 12:57
Thank you. That solved my problem.
– Никита Ларионов
Jan 18 at 12:57
add a comment |
Никита Ларионов is a new contributor. Be nice, and check out our Code of Conduct.
Никита Ларионов is a new contributor. Be nice, and check out our Code of Conduct.
Никита Ларионов is a new contributor. Be nice, and check out our Code of Conduct.
Никита Ларионов is a new contributor. Be nice, and check out our Code of Conduct.
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%2f54254378%2fissue-with-calling-static-template-method-inside-a-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
Is
types
an enum?– Max Langhof
Jan 18 at 12:51
Yes, it's an enum. enum class types : uint8_t { a, b };
– Никита Ларионов
Jan 18 at 12:54