Currying template with parameter from another template
I have class Foo
, which has two template parameters, A
and B
:
template<typename A, typename B>
struct Foo {};
Also I have class Base
, which has one template template parameter:
template<template<typename B> typename Foo>
struct Base {};
I want to write class Derived
assuming the following:
Derived
has one template parameter (A
)
Derived
extends classBase
Derived
passes as template parameter to classBase
classFoo
, but with one parameter "currying" (A
)
How can I do this?
Here is my (not working) solution:
template<template<typename B> typename Foo>
struct Base {};
template<typename A, typename B>
struct Foo {};
template<template<typename A, typename B> typename Foo, typename A>
struct BindFirst {
template<typename B>
using Result = Foo<A, B>;
};
template<typename A>
struct Derived : Base<
// error is here
typename BindFirst<Foo, A>::Result
> {};
Which gives me error:
template argument for template template parameter must be a class template or type alias template
c++ templates metaprogramming currying
add a comment |
I have class Foo
, which has two template parameters, A
and B
:
template<typename A, typename B>
struct Foo {};
Also I have class Base
, which has one template template parameter:
template<template<typename B> typename Foo>
struct Base {};
I want to write class Derived
assuming the following:
Derived
has one template parameter (A
)
Derived
extends classBase
Derived
passes as template parameter to classBase
classFoo
, but with one parameter "currying" (A
)
How can I do this?
Here is my (not working) solution:
template<template<typename B> typename Foo>
struct Base {};
template<typename A, typename B>
struct Foo {};
template<template<typename A, typename B> typename Foo, typename A>
struct BindFirst {
template<typename B>
using Result = Foo<A, B>;
};
template<typename A>
struct Derived : Base<
// error is here
typename BindFirst<Foo, A>::Result
> {};
Which gives me error:
template argument for template template parameter must be a class template or type alias template
c++ templates metaprogramming currying
2
BindFirst<Foo, A>::template Result
(notypename
, it's a template).
– Henri Menke
Nov 12 '18 at 22:19
1
Live demo: gcc.godbolt.org/z/RpsRbT
– melpomene
Nov 12 '18 at 22:21
add a comment |
I have class Foo
, which has two template parameters, A
and B
:
template<typename A, typename B>
struct Foo {};
Also I have class Base
, which has one template template parameter:
template<template<typename B> typename Foo>
struct Base {};
I want to write class Derived
assuming the following:
Derived
has one template parameter (A
)
Derived
extends classBase
Derived
passes as template parameter to classBase
classFoo
, but with one parameter "currying" (A
)
How can I do this?
Here is my (not working) solution:
template<template<typename B> typename Foo>
struct Base {};
template<typename A, typename B>
struct Foo {};
template<template<typename A, typename B> typename Foo, typename A>
struct BindFirst {
template<typename B>
using Result = Foo<A, B>;
};
template<typename A>
struct Derived : Base<
// error is here
typename BindFirst<Foo, A>::Result
> {};
Which gives me error:
template argument for template template parameter must be a class template or type alias template
c++ templates metaprogramming currying
I have class Foo
, which has two template parameters, A
and B
:
template<typename A, typename B>
struct Foo {};
Also I have class Base
, which has one template template parameter:
template<template<typename B> typename Foo>
struct Base {};
I want to write class Derived
assuming the following:
Derived
has one template parameter (A
)
Derived
extends classBase
Derived
passes as template parameter to classBase
classFoo
, but with one parameter "currying" (A
)
How can I do this?
Here is my (not working) solution:
template<template<typename B> typename Foo>
struct Base {};
template<typename A, typename B>
struct Foo {};
template<template<typename A, typename B> typename Foo, typename A>
struct BindFirst {
template<typename B>
using Result = Foo<A, B>;
};
template<typename A>
struct Derived : Base<
// error is here
typename BindFirst<Foo, A>::Result
> {};
Which gives me error:
template argument for template template parameter must be a class template or type alias template
c++ templates metaprogramming currying
c++ templates metaprogramming currying
edited Nov 12 '18 at 22:16
diraria
asked Nov 12 '18 at 22:09
dirariadiraria
6901625
6901625
2
BindFirst<Foo, A>::template Result
(notypename
, it's a template).
– Henri Menke
Nov 12 '18 at 22:19
1
Live demo: gcc.godbolt.org/z/RpsRbT
– melpomene
Nov 12 '18 at 22:21
add a comment |
2
BindFirst<Foo, A>::template Result
(notypename
, it's a template).
– Henri Menke
Nov 12 '18 at 22:19
1
Live demo: gcc.godbolt.org/z/RpsRbT
– melpomene
Nov 12 '18 at 22:21
2
2
BindFirst<Foo, A>::template Result
(no typename
, it's a template).– Henri Menke
Nov 12 '18 at 22:19
BindFirst<Foo, A>::template Result
(no typename
, it's a template).– Henri Menke
Nov 12 '18 at 22:19
1
1
Live demo: gcc.godbolt.org/z/RpsRbT
– melpomene
Nov 12 '18 at 22:21
Live demo: gcc.godbolt.org/z/RpsRbT
– melpomene
Nov 12 '18 at 22:21
add a comment |
1 Answer
1
active
oldest
votes
The template Base
expects a template as the first parameter but you attempt to pass a dependent type (indicated by typename
), hence the error message. Moreover, the nested alias Result
inside BindFirst
is a template and therefore would require a template parameter for use with typename
. So instead of
typename BindFirst<Foo, A>::Result
you have to tell the compiler that Result
is in fact a template, using
BindFirst<Foo, A>::template Result
Live example
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%2f53270817%2fcurrying-template-with-parameter-from-another-template%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
The template Base
expects a template as the first parameter but you attempt to pass a dependent type (indicated by typename
), hence the error message. Moreover, the nested alias Result
inside BindFirst
is a template and therefore would require a template parameter for use with typename
. So instead of
typename BindFirst<Foo, A>::Result
you have to tell the compiler that Result
is in fact a template, using
BindFirst<Foo, A>::template Result
Live example
add a comment |
The template Base
expects a template as the first parameter but you attempt to pass a dependent type (indicated by typename
), hence the error message. Moreover, the nested alias Result
inside BindFirst
is a template and therefore would require a template parameter for use with typename
. So instead of
typename BindFirst<Foo, A>::Result
you have to tell the compiler that Result
is in fact a template, using
BindFirst<Foo, A>::template Result
Live example
add a comment |
The template Base
expects a template as the first parameter but you attempt to pass a dependent type (indicated by typename
), hence the error message. Moreover, the nested alias Result
inside BindFirst
is a template and therefore would require a template parameter for use with typename
. So instead of
typename BindFirst<Foo, A>::Result
you have to tell the compiler that Result
is in fact a template, using
BindFirst<Foo, A>::template Result
Live example
The template Base
expects a template as the first parameter but you attempt to pass a dependent type (indicated by typename
), hence the error message. Moreover, the nested alias Result
inside BindFirst
is a template and therefore would require a template parameter for use with typename
. So instead of
typename BindFirst<Foo, A>::Result
you have to tell the compiler that Result
is in fact a template, using
BindFirst<Foo, A>::template Result
Live example
answered Nov 12 '18 at 22:24
Henri MenkeHenri Menke
7,54011327
7,54011327
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%2f53270817%2fcurrying-template-with-parameter-from-another-template%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
2
BindFirst<Foo, A>::template Result
(notypename
, it's a template).– Henri Menke
Nov 12 '18 at 22:19
1
Live demo: gcc.godbolt.org/z/RpsRbT
– melpomene
Nov 12 '18 at 22:21