2009-12-16 62 views
1

不幸的是我还接到了在这里与我的模板代码的问题:C++问题的std ::对,前置声明

C++ fancy template code problem

上的文件“实用工具”中的第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对,没有?

+0

什么是第49行? – 2009-12-16 01:55:32

+0

实用程序的第49行是什么,以及您使用traceCols的其他位置? – Smashery 2009-12-16 01:56:04

回答

2

在您致电make_pair()时,请尝试明确地将NULL转换为IntersectionData *

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

嘿耶 - 解决了这个问题!但如果有人能解释为什么这是必要的,我会很高兴。 – Mat 2009-12-16 02:13:49

+1

在Visual Studio中(我假设你使用的是错误消息),NULL被定义为文字'0',所以你使用'make_pair'成为'make_pair(MaterialMatth(),0)',键入'pair '。 – 2009-12-16 02:17:40

+0

事实上,无论您使用哪种编译器,C++标准都要求将NULL定义为“0”。 – 2009-12-16 06:20:23

1

初始化其中一个对时出现问题。

问问自己,“什么初始化?”

答案是向量traceCols。

现在问一下,“我在哪里创建traceCols中的元素?”

一旦你回答了这个问题,你应该知道发生了什么问题。

+0

可能是我用NULL创建一对的问题? NULL可能是一个const int .. – Mat 2009-12-16 02:04:48

0

看起来您的任务是从pair<MaterialMatth,int>。编译器试图将其转换为您列出的声明,但不能将其从int转换为指针,而无需进行明确的转换。

1

当心线(*traceCols)[traceCols->size()].second = new IntersectionData(*newIData) - 好像这将走出矢量边界的(因为载体的最大的指数是size() - 1)。

我不确定NULL是否导致它 - 所以注释掉该行,并亲自查看(或尝试Dave的建议)!如果它不起作用,请注明另一个。最终,你会找到什么线路,并能够提出更具体的问题,否则就不会有这些问题,并且你会知道你必须在其他地方搜索。当我看到所有这些愚蠢的编译器错误消息时,就是这么做的。