Объедините все элементы из пары векторов в один, используя шаблоны - PullRequest
2 голосов
/ 07 мая 2019

Я пытаюсь объединить пару векторов в один, используя шаблоны, но я не могу заставить его работать из-за ошибки компилятора:

error: no matching function for call to   'to_vec_from_vectors(std::vector<std::vector<std::__cxx11::basic_string<char> > >&)' 

Код довольно прост.У меня есть две функции, одна перебирает массив векторов, другая добавляет все элементы в вектор результата.Ценю любую помощь.У меня есть следующий код:

template <typename Container>
Container& concat(Container& c1, Container const& c2)
{
    c1.insert(end(c1), begin(c2), end(c2));
    return c1;
}

template <typename Container>
inline auto to_vec_from_vectors(Container& c) -> std::vector<typename decltype(*std::begin(c))::value_type>
{
    std::vector<typename decltype(*std::begin(c))::value_type> v;

    for (auto& e : c)
    {
        concat(v, e);
    }

    return v;
}

int main()
{
    vector<string> malwares1 = {"Malware1", "Malware2"};
    vector<string> malwares2 = {"Malware3", "Malware4"};
    vector<vector<string>> mVector = {malwares1, malwares2};

    vector<string> malwares3 = to_vec_from_vectors(mVector);

    return 0;
}

Ответы [ 2 ]

3 голосов
/ 07 мая 2019

Тип typename decltype(*std::begin(c))::value_type кажется тем, что доставляет вам проблемы.typename Container::value_type::value_type у меня работает .

#include <vector>
#include <string>

template <typename Container>
Container& concat(Container& c1, Container const& c2)
{
    c1.insert(end(c1), begin(c2), end(c2));
    return c1;
}

template <typename Container>
inline auto to_vec_from_vectors(Container& c) -> std::vector<typename Container::value_type::value_type>
{
    std::vector<typename Container::value_type::value_type> v;

    for (auto& e : c)
    {
        concat(v, e);
    }

    return v;
}

int main()
{
    using std::vector;
    using std::string;

    vector<string> malwares1 = {"Malware1", "Malware2"};
    vector<string> malwares2 = {"Malware3", "Malware4"};
    vector<vector<string>> mVector = {malwares1, malwares2};

    vector<string> malwares3 = to_vec_from_vectors(mVector);

    return 0;
}
2 голосов
/ 07 мая 2019

*std::begin(c) возвращает vector<string>&, вы не можете сохранить ссылку на вектор в другом векторе, используйте remove_reference_t, чтобы удалить его:

template <typename Container>
inline 
auto to_vec_from_vectors(Container& c) ->   std::vector<typename std::remove_reference_t<decltype(*std::begin(c))>::value_type>
{

    std::vector<typename std::remove_reference_t<decltype(*std::begin(c))>::value_type> v;

    for (auto& e : c)
    {
        concat(v, e);
    }

    return v;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...