Проблема C ++ с объявлениями std :: pair и forward - PullRequest
1 голос
/ 16 декабря 2009

К сожалению, у меня все еще есть проблема с моим шаблонным кодом:

Необычная проблема кода шаблона 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; 
};

и других ошибок компилятора нет

как я могу отследить это?

// edit: утилита не мой код. он должен быть от 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: единственные места, где я могу что-то изменить в содержании трассировок, выглядят так:

            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 ]

2 голосов
/ 16 декабря 2009

Попробуйте явно привести NULL к IntersectionData * при вызове к make_pair().

if(traceCols){
        traceCols->push_back(make_pair(MaterialMatth(), (IntersectionData *)NULL));
}
1 голос
/ 16 декабря 2009

Остерегайтесь линии (*traceCols)[traceCols->size()].second = new IntersectionData(*newIData) - кажется, что она вышла бы за границы вектора (так как самый большой индекс вектора - size() - 1).

Я не уверен, что NULL вызывает это, поэтому закомментируйте эту строку и убедитесь сами (или попробуйте предложение Дейва)! Если это не работает, закомментируйте другое. В конце концов, вы либо найдете какую строку, и сможете задать более конкретный вопрос, либо это не будет ничего из этого, и вы будете знать, что вам нужно искать где-то еще. Вот что я делаю, когда вижу все эти глупые сообщения об ошибках компилятора.

1 голос
/ 16 декабря 2009

Не удалось инициализировать одну из этих пар.

Спросите себя: «Что это инициализирует?»

Ответом является вектор traceCols.

Теперь спросите: «Где я создаю элементы в traceCols?»

Как только вы ответите, вы должны знать, что происходит не так.

0 голосов
/ 16 декабря 2009

Похоже, у вас есть назначение где-то из pair<MaterialMatth,int>. Компилятор пытается преобразовать это в объявление, которое вы перечислили, но он не может преобразовать int в указатель без явного преобразования.

...