我正在尝试使用模板将两个向量组合为一个向量,但是由于编译器错误,我无法使其工作:
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;
}
答案 0 :(得分:3)
typename decltype(*std::begin(c))::value_type
类型似乎是给您带来麻烦的原因。 typename Container::value_type::value_type
works for me。
#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;
}
答案 1 :(得分:2)
*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;
}