std :: pair和forward声明的C ++问题

时间:2009-12-16 01:49:46

标签: c++ utility std-pair

不幸的是,我的模板化代码仍然存在问题:

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对,没有?

4 个答案:

答案 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转换为指针。