1

クラス オブジェクトを取り込むベクターがありますが、作成したオブジェクトをベクターにプッシュ バックしようとすると、これらの問題が発生し、回避する方法がわかりません。誰でも私を助けてくれますか?

    void populate( std::vector<NV*> vNav, NV *nVess); 

オブジェクトクラスの作成

    NV vPB;

オブジェクトクラス変数の一致

    vPB.name = namE;
    vPB.type = typE;
    vPB.length = lengtH;
    vPB.speed = speeD;
    vPB.range = rangE;
    vPB.serialNum = serialNuM;
    vPB.serialNum = beaM;
    vPB.displacement = displacemenT;
    vPB.draft = drafT;
    vPB.isActive = isActivE;

    namE = name;
    typE = type;
    lengtH = length;
    speeD = speed;
    rangE = range;
    serialNuM = serialNum;
    beaM = beam;
    displacemenT = displacement;
    drafT = draft;
    isActivE = isActive;

    vNav.push_back(vPB);

エラー C2664: パラメーター 1 を 'N_V::NV' から 'N_V::NV *&&' に変換できません

また、IntelliSence no instance of overload function というエラーが発生し続けます

4

4 に答える 4

2

ベクターはオブジェクトへのポインターを期待していますが、プッシュバックしている vPB はオブジェクトへのポインターではなく、オブジェクト自体です。

これを修正するためにできる最低限のことは次のとおりです。

 NV* vPB = new NV();
 vPB->name = namE;
 ... and similarly for all the members you need to initialize ...
 vNav.push_back(vPB);

第 2 に、vNav ベクトルは値によって渡されるため、その関数のコンテキスト内にのみ存在します。おそらく参照によって引数を取りたいでしょう。これは、関数の署名を次のように変更することを意味します。

void populate( std::vector<NV*>& vNav, NV *nVess); 

最後に、できる限りネイキッド ポインターを使用することはお勧めできません。オブジェクトの有効期間が正しく管理され、メモリ割り当てがリークしないようにするためのより高度な手順として、shared_ptr と unique_ptr を調べてみてください。

于 2014-05-02T17:58:41.440 に答える
0

他の人が指摘したように、タイプがオブジェクトポインターである必要があるオブジェクトを挿入しようとしています。別のエラーは、ベクトルを値で渡していることです。参照渡しである必要があります。そうしないと、呼び出し元に挿入の効果が表示されません。

          void populate( std::vector<NV*>& vNav, NV *nVess); 
于 2014-05-02T17:59:40.683 に答える
0

populate私はあなたの関数を次のように書きます

void populate( std::vector<NV>& vNav, NV& nVess); 

ベクトル内のオブジェクトへのポインターを追加する場合を除きます。そして、このエラーがどこで発生するかは明確ではありません。エラーが発生した場所にコードを投稿できますか? にありpush_backますか?はいの場合は、オブジェクトをプッシュバックしようとしているが、ベクトルがオブジェクトへのポインターを期待しているためです。

于 2014-05-02T18:00:08.560 に答える
0

vNavとして宣言されていますが、ポインターではなくオブジェクトをそこにstd::vector<NV*>プッシュしようとしています。NVというわけで型違いです。また、ベクトルを値で渡しますが、これはおそらく意図したものではありません。

ポインターのベクトルを使用すると、非常に問題が発生します。オブジェクトにスペースを手動で割り当ててから、忘れずに割り当てる必要があるためです。使用するコードを修正する std::vector<NV>か、少なくともスマート ポインターについて読むことをお勧めします。

于 2014-05-02T17:57:53.517 に答える