错误:没有匹配函数来调用'make_pair(int&,Quest *)'

时间:2010-08-24 17:43:42

标签: c++ gcc compiler-errors

我在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&amp;,Quest *)'

6 个答案:

答案 0 :(得分:18)

您最有可能使用libstdc ++库的C ++ 0x版本。 C ++ 0x将make_pair声明为

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

如果T1int,则xint&&,因此不能使用int类型的左值。很明显,make_pair被设计为在没有显式模板参数的情况下被调用

make_pair(*id, NULL)

答案 1 :(得分:10)

它是否适用于显式演员?

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

另外,一个9000行的cpp文件,真的吗?

答案 2 :(得分:2)

只需删除模板参数:

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

这可以解决您的问题。

答案 3 :(得分:0)

如果2值需要NULL值,则可能需要显式类型转换:

return make_pair((node)NULL,(node)NULL); // NULL value
return make_pair((node *)NULL,(node *)NULL); // NULL pointer value

答案 4 :(得分:0)

对你们来说这可能会有点晚,但对其他人来说可能有用。

有完全相同的问题:

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;

答案 5 :(得分:-1)

NULL不是Quest* - 它可能被定义为某个地方的((void *)0),它不能隐式转换为Quest*。请改用static_cast<Quest*>(0)