1

残念ながら、ここからテンプレートコードに問題が発生しました。

C++ファンシーテンプレートコードの問題

ファイル'utility'の49行目:

error C2440: 'Initializing': cannot convert from 'const int' to 'IntersectionData *'

error C2439: 'std::pair<_Ty1,_Ty2>::second': member could not be initialized

問題がどこにあるのかをどうやって理解できますか?'IntersectionData *'とペアを使用する唯一の場所はここにあります:

#include "MRMaterialMatth.h"
#include "IntersectionData.h"
using namespace std;

struct IShaderMatth {
 virtual ~IShaderMatth() {}
 vector<pair<MaterialMatth,IntersectionData*> > traceCols; 
};

他のコンパイラエラーはありません

どうすればこれを追跡できますか?

//編集:ユーティリティは私のコードではありません。stdからのものである必要があります。49行目のコードは次のようになります。

template<class _Other1,
    class _Other2>
    pair(const pair<_Other1, _Other2>& _Right)
    : first(_Right.first), second(_Right.second)
    {   // construct from compatible pair
    }

49行目はコメントの行です

edit2:tracecolsの内容について何かを変更する唯一の場所は次のようになります:

            IntersectionData* iDataOut = NULL;
            if(newIData_out!=NULL)
            {
                iDataOut = new IntersectionData(*iData);
            }
            traceCols->push_back(make_pair(MaterialMatth(),iDataOut));

    if(traceCols){
        traceCols->push_back(make_pair(MaterialMatth(), NULL));
    }

        if(traceCols)
        {
            (*traceCols)[traceCols->size()].second = new IntersectionData(*newIData);
        }

NULLは問題ですか?それはポインタなので、NULLでペアを作成することを許可する必要がありますね??

4

4 に答える 4

2

NULLtoIntersectionData *の呼び出しでtoを明示的にキャストしてみてくださいmake_pair()

if(traceCols){
        traceCols->push_back(make_pair(MaterialMatth(), (IntersectionData *)NULL));
}
于 2009-12-16T02:08:11.450 に答える
1

これらのペアの1つを初期化する際に問題があります。

「何がそれを初期化するのか」と自問してください。

答えはベクトルtraceColsです。

ここで、「traceColsのどこで要素を作成していますか?」と尋ねます。

あなたがそれに答えたら、あなたは何が悪いのかを知る必要があります。

于 2009-12-16T01:55:26.047 に答える
1

行に注意して(*traceCols)[traceCols->size()].second = new IntersectionData(*newIData)ください-それはベクトルの範囲外になるようです(ベクトルの最大のインデックスはですのでsize() - 1)。

NULLが原因かどうかはわかりません。その行をコメントアウトして、自分の目で確かめてください(またはDaveの提案を試してください)。それが機能しない場合は、別のコメントを付けてください。最終的には、どの行を見つけてより具体的な質問をすることができるか、またはそれはそれらのどれでもないでしょう、そしてあなたはあなたがどこか他の場所を検索しなければならないことを知るでしょう。これらのばかげたコンパイラエラーメッセージをすべて見ると、それが私が行うことです。

于 2009-12-16T02:08:42.533 に答える
0

のどこかに割り当てがあるようですpair<MaterialMatth,int>。コンパイラーはそれからリストされた宣言に変換しようとしていますが、明示的なキャストなしではintからポインターに変換できません。

于 2009-12-16T01:56:35.683 に答える