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

問題は、CPoint の後の括弧にあります。テンプレートの目的は、クラスの数ではなく、クラスのタイプ (または、より重要なクラスのサイズ) を提供することです。試す:

std::list<CPoint> m_ElementList;
于 2012-12-14T17:36:36.420 に答える
0
 std::list<CPoint[11]> m_ElementList;

リストの型が間違っていると宣言した場合、<> 括弧は、要素の数ではなく、リストが保持する TYPE を定義します。適切な宣言は次のようになります。

std::list<CPoint> m_ElementList;
于 2012-12-14T17:33:45.417 に答える