Problema C ++ con le dichiarazioni di STD :: Coppia e in avanti
Domanda
Purtroppo ho ancora un problema con il mio codice modello da qui:
Problema del codice del modello di fantasia C ++
sulla riga 49 nell'utilità del file:
error C2440: 'Initializing': cannot convert from 'const int' to 'IntersectionData *'
error C2439: 'std::pair<_Ty1,_Ty2>::second': member could not be initialized
Come potrei capire dove si trova il problema? L'unico posto in cui uso una coppia con 'IntersectionData*' è qui:
#include "MRMaterialMatth.h"
#include "IntersectionData.h"
using namespace std;
struct IShaderMatth {
virtual ~IShaderMatth() {}
vector<pair<MaterialMatth,IntersectionData*> > traceCols;
};
e non ci sono altri errori del compilatore
Come posso rintracciare questo?
// Modifica: l'utilità non è il mio codice. Deve essere da std .. il codice della riga 49 sembra così:
template<class _Other1,
class _Other2>
pair(const pair<_Other1, _Other2>& _Right)
: first(_Right.first), second(_Right.second)
{ // construct from compatible pair
}
La riga 49 è la riga del commento
EDIT2: Gli unici posti in cui cambio qualcosa sul contenuto di Tracecoli sembrano questo:
IntersectionData* iDataOut = NULL;
if(newIData_out!=NULL)
{
iDataOut = new IntersectionData(*iData);
}
traceCols->push_back(make_pair(MaterialMatth(),iDataOut));
e
if(traceCols){
traceCols->push_back(make_pair(MaterialMatth(), NULL));
}
e
if(traceCols)
{
(*traceCols)[traceCols->size()].second = new IntersectionData(*newIData);
}
Null è il problema? È un puntatore, quindi dovrei essere autorizzato a creare una coppia con null, no ??
Soluzione
Prova a lanciare esplicitamente il NULL
a IntersectionData *
Nella tua chiamata a make_pair()
.
if(traceCols){
traceCols->push_back(make_pair(MaterialMatth(), (IntersectionData *)NULL));
}
Altri suggerimenti
C'è un problema inizializzando una di quelle coppie.
Chiediti: "Cosa inizializza?"
La risposta è il vettoriale tracecoli.
Ora chiedi: "Dove sto creando elementi in Tracecols?"
Una volta che rispondi, dovresti sapere cosa non va.
Fai attenzione alla linea (*traceCols)[traceCols->size()].second = new IntersectionData(*newIData)
- Sembra che sarebbe uscito dai limiti del vettore (poiché il più grande indice di un vettore è size() - 1
).
Non sono sicuro che il null lo stia causando - quindi commenta quella linea e vedi di persona (o prova il suggerimento di Dave)! Se non funziona, commenta un altro. Alla fine, troverai quale linea e sarai in grado di porre una domanda più specifica, o non sarà nessuna di queste cose e saprai che devi cercare altrove. Questo è quello che faccio quando vedo tutti questi sciocchi messaggi di errore del compilatore.
Sembra che tu abbia un incarico da qualche parte da un pair<MaterialMatth,int>
. Il compilatore sta cercando di convertirsi da quello alla dichiarazione che hai elencato, ma non può convertirsi da un INT in un puntatore senza un cast esplicito.