1

我有一个名为vertices的数组,它的声明如下:

  CPoint vertices[11];

然后我有一个名为 _m_ElementList_ 的列表

  std::list<CPoint[11]> m_ElementList;

使用AddElement()我想向这个列表中添加元素,每个元素都是一个CPoint对象数组(即与顶点类型相同)

void AddElement(CPoint* vertices)
   { m_ElementList.push_back(vertices); }

由于某种原因不起作用,它告诉我没有函数实例与参数列表匹配 - 为什么会这样,我该怎么办?

4

4 回答 4

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这将是一个更好的名字。

于 2012-12-14T17:33:36.633 回答
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 以外的值,这也有一点优势,因为动态分配允许使用变量代替常量。但是,您需要仔细控制对向量、它包含的数组和元素的访问,以强制正确使用。

顺便说一句,混合和匹配 STL 和 C 风格的指针完全没问题,特别是如果您希望传递相当多的数据结构并且复制元素是不可取的或昂贵的。

于 2012-12-14T18:19:04.927 回答
0
 std::list<CPoint[11]> m_ElementList;

您声明列表类型错误,<> 括号定义列表包含的类型,而不是多少元素,正确的声明将是:

std::list<CPoint> m_ElementList;
于 2012-12-14T17:33:45.417 回答
0

问题在于 CPoint 后面的括号。模板的目的是提供类的类型(或更重要的是,类的大小),而不是数量。尝试:

std::list<CPoint> m_ElementList;
于 2012-12-14T17:36:36.420 回答