错误:在初始化时无法将'std :: vector <float>'转换为'float'

时间:2018-04-14 22:42:04

标签: c++ c++11 struct error-handling stdvector

我已将boundary_info结构的向量定义为std::vector<boundary_info> nodes,以便在我的代码中用于特定目的。当我尝试在特定函数中push_back将新元素添加到此向量中时:

void myFun()
{
   std::vector<float_type> dists(9, -1.0);
   std::array<float_type,9> f, g;

   //do something - x and y are defined here

   nodes.push_back(boundary_info{point<int>{x,y}, dists, f, g, {}});
}

我收到以下错误消息:

Error 1 : cannot convert ‘std::vector<float>’ to ‘float’ in initialization
Error 2 : cannot convert ‘std::array<float, 9ul>’ to ‘float’ in 
initialization
Error 3 : cannot convert ‘std::array<float, 9ul>’ to ‘float’ in 
initialization

错误1与dists相关联,f, g是一个向量。错误2和3分别与push_back中作为参数传递的#include <iostream> #include <vector> template <typename T> struct point //specify a point structure { T x,y; }; struct boundary_info { point<int> xy_bdary; //coordinates of a bdary point std::array<float_type,9> dist; //distance from boundary std::array<float_type,9> f_prev, g_prev; //populations std::vector<int> miss_dirns; //missing directions }; 相关联。 代码如下所示。

<Maps:MapControl x:Name="map_main" Loaded="MapLoaded" MapTapped="MapUserTapped"/>

如果能指出这个错误的解决方案,我会很高兴的。半天以来我一直在努力。

注意:我正在使用c ++ 11进行编译。

修改 你可以找到这个问题的最小代码,重现同样的问题 https://repl.it/repls/GleefulTartMarkuplanguage

谢谢

1 个答案:

答案 0 :(得分:1)

在以下行中,您尝试从std::arrayboundary_info::dist)初始化std::vectordists):

nodes.push_back(boundary_info{point<int>{x,y}, dists, f, g, {}});

std::array没有接受std::vector的构造函数。您只能初始化std::array元素(聚合初始化)或明确将std::vector复制到std::array

聚合初始化

nodes.push_back(boundary_info{point<int>{x,y}, {dists[0], dists[1], dists[2], dists[3], dists[4], dists[5], dists[6], dists[7], dists[8]}, f, g, {}});

当然,这不是很优雅。

std::vector复制到std::array

借助一点模板功能,我们可以做得更好。

template<typename T, std::size_t N, typename Range>
std::array<T,N> to_array( Range const& in )
{
    std::array<T,N> result;

    // To make the standard begin() and end() in addition to any user-defined
    // overloads available for ADL.
    using std::begin; using std::end;

    std::copy( begin( in ), end( in ), result.begin() );

    return result;
}

Live demo

to_array接受任何具有begin()end()成员函数或自由函数begin()end()重载的输入类型。

现在你可以像这样从矢量初始化数组:

nodes.push_back(boundary_info{point<int>{x,y}, to_array<float_type,9>(dists), f, g, {}});

请注意,如果dists的元素多于数组,则您可以轻松拍摄自己,因为to_array没有进行任何范围检查(std::copy没有&#39} ; t do)。如果需要的话,我会把它作为练习让读者更安全。