c++ - 函数对象与函数指针的区别??
迷茫
迷茫 2017-04-17 15:18:00
0
3
717

我定义了一个类,然后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;
}

请问这是为什么??

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全員に返信(3)
迷茫

已经解决了,谢谢大家,因为传递函数指针的时候,没有初始化
应该写成这样:
priority_queue<Foo, vector<Foo>, decltype(cmp)*> que(cmp);

いいねを押す +0
小葫芦

我觉得应该是函数指针需要你在构造函数的参数里面传递一个函数名,因为指针不能进行默认构造。而struct cmp有一个默认构造函数,可以自动构造,就不需要你再次传递了。

いいねを押す +0
PHPzhong

template <class T, class Container = vector<T>,
class Compare = less<typename Container::value_type> > class priority_queue;

Compare - A Compare type providing a strict weak ordering.

cmp要为一个class,而且不是class *。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!