C ++编程候选函数不可行

时间:2016-01-19 13:16:27

标签: c++ priority-queue functor

我正在尝试创建一个优先级队列,其中最顶层的元素包含最小的整数。我做了一个函数对象进行比较。一切进展顺利但是,每当我尝试打印出最顶层的元素std::cout<<pq.top<<std::endl时,我都会收到错误消息:

candidate function not viable: no known conversion from 'const value_type' (aka 'const Foo') to
  'const void *' for 1st argument; take the address of the argument with &
basic_ostream& operator<<(const void* __p);

我对编程很陌生,所以我真的不知道该怎么做。

#include<iostream>
#include<queue> 
#include <vector>


class Foo
{
public:
  int data;
  Foo(int data): data(data) {}
};

class Compare
{
public:
    int operator() (Foo dat1, Foo dat2)
    {
      if( dat1.data < dat2.data )
        return dat1.data;
      else return dat2.data;
    }
};

int main()
{
  std::priority_queue<Foo, std::vector<Foo>, Compare> pq;

  pq.push(5);
  pq.push(7);
  pq.push(1);
  pq.push(2);
  pq.push(3);

  std::cout << pq.top() << std::endl; 
    return 0;
}

2 个答案:

答案 0 :(得分:2)

您从未定义过输出Foo的方法。你可以使用

std::cout << pq.top().data << std::endl; 

或者您可以重载operator<< Foo以输出它

class Foo
{
public:
    int data;
    Foo(int data) : data(data) {}
    friend std::ostream & operator<<(std::ostream& os, const Foo & f)
    {
        return os << f.data;
    }
};

您的比较功能也存在问题。比较函数应返回true if dat1.data > dat2.data,以便将最小元素放到顶部。有了它,你应该改为:

bool operator() (const Foo& dat1, const Foo& dat2)
{
  return dat1.data > dat2.data;
}

答案 1 :(得分:0)

std::cout << pq.top() << std::endl; 

上面一行中的调用pq.top()返回一个Foo对象,程序不知道该对象是否打印。这样就会产生错误。通过使用&pq.top(),您可以打印对象的地址,但由于您现在不想这样做,您可以使用pq.top().data访问数据项并打印它。

相关问题