搜尋

首頁  >  問答  >  主體

c++ - 函数对象与函数指针的区别??

我定义了一个类,然后priority_queue中存放类并且使用自己定义的比较函数,但是如果比较函数传递的是函数指针就会发生崩溃:

class Foo
{
    friend bool cmp(Foo *, Foo *);
public:
    Foo() = default;
    Foo(int x):val(x) {}
private:
    int val;
};
bool cmp(Foo *a, Foo *b)
{
    return a->val < b->val;
}
int main()
{
    priority_queue<Foo*, vector<Foo*>, decltype(cmp)*> que;
    que.push(new Foo(5));
    que.push(new Foo(6));
    return 0;
}

如果改为函数对象则正常:

class Foo
{
    friend struct cmp;
public:
    Foo() = default;
    Foo(int x):val(x) {}
private:
    int val;
};
struct cmp
{
    bool operator()(Foo *a, Foo *b)
    {
        return a->val < b->val;
    }
};
int main()
{
    priority_queue<Foo*, vector<Foo*>, cmp> que;
    que.push(new Foo(5));
    que.push(new Foo(6));
    return 0;
}

请问这是为什么??

迷茫迷茫2809 天前778

全部回覆(3)我來回復

  • 迷茫

    迷茫2017-04-17 15:20:00

    已經解決了,謝謝大家,因為傳遞函數指標的時候,沒有初始化
    應該寫成這樣:
    priority_queue, vector>, decltype(cmp)*> que(cmp);

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 15:20:00

    我覺得應該是函數指標需要你在建構函式的參數裡面傳遞一個函式名,因為指標不能進行預設建構。而struct cmp有一個預設構造函數,可以自動構造,就不需要你再傳遞了。

    回覆
    0
  • PHPz

    PHPz2017-04-17 15:20:00

    template ,
    class Compare = less; >類別priority_queue;

    比較 - 提供嚴格弱排序的比較類型。

    cmp 要為一個類,而且不是類 *。

    回覆
    0
  • 取消回覆