我已将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
谢谢
答案 0 :(得分:1)
在以下行中,您尝试从std::array
(boundary_info::dist
)初始化std::vector
(dists
):
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;
}
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)。如果需要的话,我会把它作为练习让读者更安全。