不幸的是,我的模板化代码仍然存在问题:
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 :(得分:2)
尝试在NULL
的通话中明确地将IntersectionData *
转换为make_pair()
。
if(traceCols){
traceCols->push_back(make_pair(MaterialMatth(), (IntersectionData *)NULL));
}
答案 1 :(得分:1)
初始化其中一对时出现问题。
问问自己,“什么初始化了?”
答案是矢量traceCols。
现在问一下,“我在哪里创建traceCols中的元素?”
一旦你回答了这个问题,就应该知道出了什么问题。
答案 2 :(得分:1)
注意行(*traceCols)[traceCols->size()].second = new IntersectionData(*newIData)
- 看起来这会超出向量的界限(因为向量的最大索引是size() - 1
)。
我不确定NULL是否导致它 - 所以注释掉那一行,并亲自看看(或尝试Dave的建议)!如果它不起作用,请注释掉另一个。最终,你要么找到了哪一行,又能够提出一个更具体的问题,要么就是这些问题,你知道你必须在其他地方搜索。当我看到所有这些愚蠢的编译器错误消息时,这就是我所做的。
答案 3 :(得分:0)
看起来你在pair<MaterialMatth,int>
的任何地方都有作业。编译器正在尝试将其转换为您列出的声明,但是如果没有显式转换,它就无法从int转换为指针。