我有一个名为 vertices 的数组,它的声明如下:
CPoint vertices[11];
然后我有一个名为_m_ElementList _
的列表 std::list<CPoint[11]> m_ElementList;
使用 AddElement()我想在此列表中添加元素,每个元素都是 CPoint 对象的数组(即与顶点相同的类型)
void AddElement(CPoint* vertices)
{ m_ElementList.push_back(vertices); }
由于某些原因,它不起作用,它告诉我该函数的任何实例都不匹配参数列表 - 为什么这是我应该做什么?
答案 0 :(得分:3)
使用原始数组和指针的想法开始时是错误的。您已经在使用std::list
(即您似乎了解标准容器),那么为什么不使用std::vector<CPoint>
呢?它会让你的生活变得轻松:
std::list<std::vector<CPoint>> m_ElementList;
然后:
void AddElement(std::vector<CPoint> vertices) //C++11
{
m_ElementList.push_back(std::move(vertices)); //move
}
如果您的编译器不支持C ++ 11,则按引用传递:
void AddElement(std::vector<CPoint> const & vertices) //C++03
{
m_ElementList.push_back(vertices); //copy
}
作为旁注,我认为AddVertices
会是一个更好的名字。
答案 1 :(得分:1)
您可以将数组引用为数组本身或指向第一个元素的指针。例如:
CPoint vertices[11];
// address of the first element
p_vertices = &vertices;
或
// allocate
CPoint * vertices = new CPoint[11];
// deallocate
delete [] veritices;
如果你采用后一种方法,你可以简单地将你的向量声明为:
std::vector<CPoint*> m_elementList
并插入为:
void AddElement(CPoint* points)
{
m_elementList.push_back(points);
}
如果您需要将点数更改为11以外的值,这也有一点点优势,因为动态分配允许使用变量代替常量。但是,您需要仔细控制对向量,包含的数组和元素的访问,以便强制使用。
BTW,它完全可以混合和匹配STL和C风格的指针,特别是如果你期望将数据结构传递到相当多的位置并且复制元素是不可取的或昂贵的。答案 2 :(得分:0)
std::list<CPoint[11]> m_ElementList;
您声明列表类型错误,&lt;&gt;括号定义列表所包含的TYPE,而不是多少元素,一个适当的声明:
std::list<CPoint> m_ElementList;
答案 3 :(得分:0)
问题在CPoint之后有括号。模板的目的是提供类的类型(或更重要的是,类的大小),而不是数字。尝试:
std::list<CPoint> m_ElementList;