2009-12-16 13 views
1

Malheureusement, j'ai toujours eu un problème avec mon code basé sur un modèle d'ici:C++ problème avec std :: pair et déclarations avant

C++ fancy template code problem

en ligne 49 dans le fichier 'utilitaire':

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

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

comment pourrais-je comprendre où est le problème? le seul endroit où j'utilise une paire avec « IntersectionData * » est ici:

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

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

et il n'y a pas d'autres erreurs du compilateur

comment puis-je suivre dans cette? // edit: l'utilitaire n'est pas mon code. il doit être de std .. le code de la ligne 49 ressemble à ceci:

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

ligne 49 est la ligne du commentaire

Edit2: les seuls endroits où je change quelque chose au sujet du contenu de tracecols ressembler à ceci:

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

et

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

et

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

est le problème? c'est un pointeur, donc je devrais être autorisé à créer une paire avec NULL, non ??

+0

À la ligne 49? –

+0

Qu'est-ce que la ligne 49 d'utilitaire, et où d'autre utilisez-vous traceCols? – Smashery

Répondre

2

Essayez de convertir explicitement le NULL en IntersectionData * lors de votre appel au make_pair().

if(traceCols){ 
     traceCols->push_back(make_pair(MaterialMatth(), (IntersectionData *)NULL)); 
} 
+0

hey ouais - qui a résolu le problème! mais je serais vraiment heureux si quelqu'un pouvait m'expliquer pourquoi c'est nécessaire? – Mat

+1

Dans Visual Studio (que je suppose que vous utilisez des messages d'erreur), 'NULL' est défini comme un' 0' littéral, donc votre utilisation de 'make_pair' devient' make_pair (MaterialMatth(), 0) ', de tapez 'pair '. –

+0

En fait, la norme C++ exige que 'NULL' soit défini comme' 0', quel que soit le compilateur que vous utilisez. –

1

Un problème est survenu lors de l'initialisation de l'une de ces paires.

Demandez-vous, "Qu'est-ce qui initialise cela?"

La réponse est le vecteur traceCols.

Maintenant, demandez, "Où puis-je créer des éléments dans traceCols?"

Une fois que vous avez répondu à cette question, vous devez savoir ce qui ne va pas.

+0

pourrait être le problème que je crée une paire avec NULL? NULL est probablement un int int .. – Mat

0

Il semble que vous ayez un devoir quelque part d'un pair<MaterialMatth,int>. Le compilateur essaie de convertir de la déclaration que vous avez listée, mais il ne peut pas convertir d'un int en un pointeur sans un cast explicite.

1

Attention à la ligne (*traceCols)[traceCols->size()].second = new IntersectionData(*newIData) - il semble que ce serait sortir des limites du vecteur (depuis le plus grand indice d'un vecteur est size() - 1). Je ne suis pas sûr si le NULL le cause - commentez ainsi cette ligne, et voyez par vous-même (ou essayez la suggestion de Dave)! Si cela ne fonctionne pas, commentez un autre.En fin de compte, soit vous trouverez la ligne, et vous pourrez poser une question plus précise, soit ce ne sera rien de tout cela, et vous saurez que vous devez chercher ailleurs. C'est ce que je fais quand je vois tous ces messages d'erreur du compilateur idiot.