ошибка: нет подходящей функции для вызова make_pair (int &, Quest *) - PullRequest
7 голосов
/ 24 августа 2010

Я получаю эту странную ошибку в g ++;он прекрасно компилируется в Visual Studio.

struct Quest
{
    static map<int, Quest*> Cache;
};

Quest *Quest::LoadFromDb(BaseResult& result, int *id)
{
    Quest *ret;
    if(result.Error())
    {
        if(id)
            Cache.insert(make_pair<int, Quest*>(*id, NULL)); // <--- Problematic line

        return NULL;
    }

// ...
}

Точная ошибка:

DataFilesStructure.cpp: 9135: 58: ошибка: не соответствует функции для вызова make_pair (int &, Quest*) '

Ответы [ 6 ]

18 голосов
/ 12 марта 2011

Скорее всего, вы используете C ++ 0x версию библиотеки libstdc ++. C ++ 0x объявляет make_pair как

template <class T1, class T2>
pair<V1, V2> make_pair(T1&& x, T2&& y) noexcept;

Если T1 равно int, то x равно int&& и поэтому не может принимать значения типа int. Совершенно очевидно, что make_pair предназначен для вызова без явных аргументов шаблона

make_pair(*id, NULL)
10 голосов
/ 24 августа 2010

Работает ли это с явным приведением?

if (id)
    Cache.insert(make_pair<int, Quest*>(int(*id), NULL));

Кроме того, файл cpp с 9000 строками, правда?

3 голосов
/ 12 марта 2011

Просто удалите параметры шаблона:

Cache.insert(make_pair(*id, NULL));

Это должно решить вашу проблему.

0 голосов
/ 03 июля 2012

Это может быть немного поздно для вас, ребята, но может быть полезно для других.

Была точно такая же проблема:

strVar= ...
newNode= ...
static map<string, Node*> nodes_str;
nodes_str.insert(make_pair(strVar, newNode)); // all OK

до

intVar= ...
newNode= ...
static map<int, Node*> nodes_int;
nodes_int.insert(make_pair(intVar, newNode)); // compile error

решил это, добавив:

using std::make_pair;
0 голосов
/ 06 сентября 2011

Если для значения 2 необходимо значение NULL, возможно, необходимо явное преобразование типа:

return make_pair((node)NULL,(node)NULL); // NULL value
return make_pair((node *)NULL,(node *)NULL); // NULL pointer value
0 голосов
/ 24 августа 2010

NULL не является Quest* - его можно определить как ((void *) 0) где-то, что неявно не преобразуется в Quest*. Вместо этого используйте static_cast<Quest*>(0).

...