【问题标题】:error: no matching function for call to 'make_pair(int&, Quest*)'错误:没有匹配函数调用“make_pair(int&, Quest*)”
【发布时间】:2011-04-03 07:51:02
【问题描述】:

我在 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*)'

【问题讨论】:

    标签: c++ gcc compiler-errors


    【解决方案1】:

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

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

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

    make_pair(*id, NULL)
    

    【讨论】:

    • @Krevan 如果我有一个整数变量 i。我想与 i 和另一个对象配对。我应该怎么称呼makepair。 1) make_pair 2) int&& j = i; make_pair?两者都不起作用。正确的做法是什么?
    • 对于 C++11 中的 make_pair,当显式指定 V1、V2 时,没有类型推导,参数 x 和 y 必须为右值。但是如果不指定V1、V2,就会发生类型推导,x和y不需要是右值。
    【解决方案2】:

    它是否适用于显式强制转换?

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

    还有一个 9000 行的 cpp 文件,真的吗?

    【讨论】:

    • 它是自动生成的,是的,int() 似乎可以修复它!
    • 这里到底发生了什么?我们有一个显式模板函数实例make_pair&lt;int,Quest*)(int, Quest*),它使用int&amp;intvoid* 类型的参数调用。然后:int&amp; 可以隐式转换为intNULL 可能会也可能不会隐式转换为Quest*,具体取决于定义(不要在C++ 中使用NULL,NULL 在C 中!) 。无论如何,我的问题是:FIRST 参数的显式转换如何解决问题?
    • @Kos:我不确定,这可能与*id 是一个左值int(*id) 是一个右值,但这更像是一种直觉:)
    • 好的,我需要检查一下,我不买它:)。在我的 GCC 4.5.1 上:make_pair&lt;int, Class*&gt;(*p, 0); 其中pint* 编译时没有警告,但是当我提供void* 而不是int 作为第二个参数时不会编译 - irregardless 如果我通过intint&amp; 作为第一个 - 正如预期的那样。这如何解决 GCC 上的 OP 问题? @Krevan,承认:) - 您将 NULL 更改为 0 或者您更改了包含项,以便您的 NULL 被另一个标题重新定义为 0 ...它必须是别的东西!我怀疑我们刚刚发现了一个 GCC 错误......
    【解决方案3】:

    只需去掉模板参数:

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

    这应该可以解决您的问题。

    【讨论】:

    • 这对我有帮助。 C++11 不需要模板参数。
    【解决方案4】:

    NULL 不是Quest*——它可能在某处被定义为 ((void *)0),它不能隐式转换为Quest*。请改用static_cast&lt;Quest*&gt;(0)

    【讨论】:

    • 不是,但可以转换为一个,例如Quest *a = NULL。我明确列出了模板参数。反正我试过了,同样的错误。
    • @Krevan:不,它有可能无法转换为一个。
    • @Billy:NULL 不是在 C++ 中定义为 0 吗?
    • @FredOverflow:通常是的,但它有可能被期望((void *)0) 的 C 库重新定义。
    • @Billy:我明白了。更期待 C++0x 的nullptr :)
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

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

      遇到了完全相同的问题:

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-08
        • 2020-07-02
        • 1970-01-01
        • 1970-01-01
        • 2013-05-05
        • 2020-07-14
        相关资源
        最近更新 更多