2009-12-16 61 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的建議)!如果它不起作用,請註明另一個。最終,你會找到什麼線路,並能夠提出更具體的問題,否則就不會有這些問題,並且你會知道你必須在其他地方搜索。當我看到所有這些愚蠢的編譯器錯誤消息時,就是這麼做的。