1

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

C++花式模板代码问题

在文件“实用程序”的第 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 行是注释的行

编辑2:我改变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

4 回答 4

2

尝试在调用 to 时显式转换NULLto 。IntersectionData *make_pair()

if(traceCols){
        traceCols->push_back(make_pair(MaterialMatth(), (IntersectionData *)NULL));
}
于 2009-12-16T02:08:11.450 回答
1

注意这条线(*traceCols)[traceCols->size()].second = new IntersectionData(*newIData)- 似乎这会超出向量的范围(因为向量的最大索引是size() - 1)。

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

于 2009-12-16T02:08:42.533 回答
1

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

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

答案是向量traceCols。

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

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

于 2009-12-16T01:55:26.047 回答
0

看起来您在某个pair<MaterialMatth,int>. 编译器正在尝试将其转换为您列出的声明,但如果没有显式强制转换,它无法从 int 转换为指针。

于 2009-12-16T01:56:35.683 回答