Почему этот список инициализаторов не может соответствовать аргументу шаблона? - PullRequest
0 голосов
/ 07 ноября 2018
#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"});
}

Ошибка (при использовании g++ -std=c++17):

error: no matching function for call to ‘Foo::Foo(<brace-enclosed initializer list>)’

Это работает

Foo foo (std::vector<const char*> ({"foo", "bar", "baz"}));

Почему список инициализаторов не может соответствовать конструктору шаблона?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Как пояснил Jarod42, {"foo", "bar", "baz"} не имеет типа, поэтому его нельзя вывести для template <typename Container> Foo (const Container&).

Другое возможное решение -

template <typename T, std::size_t N>
Foo (T const (& arr)[N])
{
    for (auto arg : arr)
        std::cout << "ARG(" << arg << ")\n";
}

поэтому {"foo", "bar", "baz"} выводится как список инициализации для массива в стиле C с правильным размером (3).

0 голосов
/ 07 ноября 2018

{"foo", "bar", "baz"} не имеет типа, поэтому его нельзя вывести для

template <typename Container>
Foo (const Container&);

Вы можете использовать его только для вычета

template <typename T>
Foo (const std::initializer_list<T>&);
...