Why can't this initializer-list match to a template argument?
#include <iostream>
class Foo
{
public:
template <typename Container>
Foo (const Container & args)
{
for (auto arg : args)
std::cout << "ARG(" << arg << ")n";
}
};
int main ()
{
Foo foo ({"foo", "bar", "baz"});
}
The error (using g++ -std=c++17
) is
error: no matching function for call to ‘Foo::Foo(<brace-enclosed initializer list>)’
This works
Foo foo (std::vector<const char*> ({"foo", "bar", "baz"}));
Why can't the initializer-list match the template constructor?
c++ templates c++17 initializer-list template-deduction
add a comment |
#include <iostream>
class Foo
{
public:
template <typename Container>
Foo (const Container & args)
{
for (auto arg : args)
std::cout << "ARG(" << arg << ")n";
}
};
int main ()
{
Foo foo ({"foo", "bar", "baz"});
}
The error (using g++ -std=c++17
) is
error: no matching function for call to ‘Foo::Foo(<brace-enclosed initializer list>)’
This works
Foo foo (std::vector<const char*> ({"foo", "bar", "baz"}));
Why can't the initializer-list match the template constructor?
c++ templates c++17 initializer-list template-deduction
add a comment |
#include <iostream>
class Foo
{
public:
template <typename Container>
Foo (const Container & args)
{
for (auto arg : args)
std::cout << "ARG(" << arg << ")n";
}
};
int main ()
{
Foo foo ({"foo", "bar", "baz"});
}
The error (using g++ -std=c++17
) is
error: no matching function for call to ‘Foo::Foo(<brace-enclosed initializer list>)’
This works
Foo foo (std::vector<const char*> ({"foo", "bar", "baz"}));
Why can't the initializer-list match the template constructor?
c++ templates c++17 initializer-list template-deduction
#include <iostream>
class Foo
{
public:
template <typename Container>
Foo (const Container & args)
{
for (auto arg : args)
std::cout << "ARG(" << arg << ")n";
}
};
int main ()
{
Foo foo ({"foo", "bar", "baz"});
}
The error (using g++ -std=c++17
) is
error: no matching function for call to ‘Foo::Foo(<brace-enclosed initializer list>)’
This works
Foo foo (std::vector<const char*> ({"foo", "bar", "baz"}));
Why can't the initializer-list match the template constructor?
c++ templates c++17 initializer-list template-deduction
c++ templates c++17 initializer-list template-deduction
edited Nov 7 '18 at 11:02
max66
36.8k74166
36.8k74166
asked Nov 7 '18 at 10:29
spraffspraff
17.9k1486165
17.9k1486165
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
{"foo", "bar", "baz"}
has no type, so it cannot be deduced for
template <typename Container>
Foo (const Container&);
You can only use it for deduction for
template <typename T>
Foo (const std::initializer_list<T>&);
add a comment |
As explained by Jarod42, {"foo", "bar", "baz"}
has no type, so it cannot be deduced for template <typename Container> Foo (const Container&)
.
Another possible solution is
template <typename T, std::size_t N>
Foo (T const (& arr)[N])
{
for (auto arg : arr)
std::cout << "ARG(" << arg << ")n";
}
so {"foo", "bar", "baz"}
is deduced as an initialization list for a C-style array with the correct size (3).
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%2f53187640%2fwhy-cant-this-initializer-list-match-to-a-template-argument%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
{"foo", "bar", "baz"}
has no type, so it cannot be deduced for
template <typename Container>
Foo (const Container&);
You can only use it for deduction for
template <typename T>
Foo (const std::initializer_list<T>&);
add a comment |
{"foo", "bar", "baz"}
has no type, so it cannot be deduced for
template <typename Container>
Foo (const Container&);
You can only use it for deduction for
template <typename T>
Foo (const std::initializer_list<T>&);
add a comment |
{"foo", "bar", "baz"}
has no type, so it cannot be deduced for
template <typename Container>
Foo (const Container&);
You can only use it for deduction for
template <typename T>
Foo (const std::initializer_list<T>&);
{"foo", "bar", "baz"}
has no type, so it cannot be deduced for
template <typename Container>
Foo (const Container&);
You can only use it for deduction for
template <typename T>
Foo (const std::initializer_list<T>&);
edited Nov 23 '18 at 20:00
Peter Mortensen
13.7k1986111
13.7k1986111
answered Nov 7 '18 at 10:32
Jarod42Jarod42
117k12103185
117k12103185
add a comment |
add a comment |
As explained by Jarod42, {"foo", "bar", "baz"}
has no type, so it cannot be deduced for template <typename Container> Foo (const Container&)
.
Another possible solution is
template <typename T, std::size_t N>
Foo (T const (& arr)[N])
{
for (auto arg : arr)
std::cout << "ARG(" << arg << ")n";
}
so {"foo", "bar", "baz"}
is deduced as an initialization list for a C-style array with the correct size (3).
add a comment |
As explained by Jarod42, {"foo", "bar", "baz"}
has no type, so it cannot be deduced for template <typename Container> Foo (const Container&)
.
Another possible solution is
template <typename T, std::size_t N>
Foo (T const (& arr)[N])
{
for (auto arg : arr)
std::cout << "ARG(" << arg << ")n";
}
so {"foo", "bar", "baz"}
is deduced as an initialization list for a C-style array with the correct size (3).
add a comment |
As explained by Jarod42, {"foo", "bar", "baz"}
has no type, so it cannot be deduced for template <typename Container> Foo (const Container&)
.
Another possible solution is
template <typename T, std::size_t N>
Foo (T const (& arr)[N])
{
for (auto arg : arr)
std::cout << "ARG(" << arg << ")n";
}
so {"foo", "bar", "baz"}
is deduced as an initialization list for a C-style array with the correct size (3).
As explained by Jarod42, {"foo", "bar", "baz"}
has no type, so it cannot be deduced for template <typename Container> Foo (const Container&)
.
Another possible solution is
template <typename T, std::size_t N>
Foo (T const (& arr)[N])
{
for (auto arg : arr)
std::cout << "ARG(" << arg << ")n";
}
so {"foo", "bar", "baz"}
is deduced as an initialization list for a C-style array with the correct size (3).
edited Nov 23 '18 at 20:00
Peter Mortensen
13.7k1986111
13.7k1986111
answered Nov 7 '18 at 11:01
max66max66
36.8k74166
36.8k74166
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%2f53187640%2fwhy-cant-this-initializer-list-match-to-a-template-argument%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