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.4k74165
36.4k74165
asked Nov 7 '18 at 10:29
spraffspraff
17.9k1485165
17.9k1485165
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.6k1985111
13.6k1985111
answered Nov 7 '18 at 10:32
Jarod42Jarod42
116k12102182
116k12102182
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.6k1985111
13.6k1985111
answered Nov 7 '18 at 11:01
max66max66
36.4k74165
36.4k74165
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