error: request for member '..' in '..' , which is of non-class type
error: request for member '..' in '..' , which is of non-class type
我使用 STL priority_queue
并提供一个自定义比较器 class,其构造函数接收指向存储优先级的向量的指针,因此 -
#include <iostream>
#include <queue> // std::priority_queue
#include <vector> // std::vector
using namespace std;
class CompareReachDist
{
const vector<float> *reach_dists;
public:
CompareReachDist(const vector<float> *input)
{
reach_dists = input;
}
bool operator() (const size_t &l, const size_t &r) const
{
return (reach_dists->at(l) > reach_dists->at(r));
}
};
typedef priority_queue<size_t, vector<size_t>, CompareReachDist> pq;
vector<float> reach_dists;
int main()
{
pq seeds(CompareReachDist(&reach_dists));
bool isEmpty = seeds.empty();
return 0;
}
但是,在编译时出现错误:
error: request for member 'empty' in 'seeds', which is of non-class type 'pq(CompareReachDist&) {aka std::priority_queue<unsigned int std::vector<unsigned int>, CompareReachDist>(CompareReachDist&)}'
我哪里错了?
这是一个解析问题。让我们把它分开:
CompareReachDist(&reach_dists)
您可能认为这会创建一个临时 CompareReachDist
,其中包含静态 reach_dists
的地址。但在整个声明的上下文中,它被解释为对 CompareReachDist
的引用。奇怪,但那是因为,粗略地说,C++ 的语法更喜欢函数声明而不是对象声明。以下
pq seeds(CompareReachDist(&reach_dists));
是一个函数的整体声明。它接受一个 CompareReachDist&
和 returns 一个 pq
.
您收到的错误是因为,很明显,函数没有您可以调用的 empty
成员。
自 C++11 以来的解决方案是支持列表初始化,这打破了歧义及其作为函数声明的解析。所以你可以这样做:
pq seeds{CompareReachDist{&reach_dists}};
并得到一个对象,正如人们所期望的那样。
我使用 STL priority_queue
并提供一个自定义比较器 class,其构造函数接收指向存储优先级的向量的指针,因此 -
#include <iostream>
#include <queue> // std::priority_queue
#include <vector> // std::vector
using namespace std;
class CompareReachDist
{
const vector<float> *reach_dists;
public:
CompareReachDist(const vector<float> *input)
{
reach_dists = input;
}
bool operator() (const size_t &l, const size_t &r) const
{
return (reach_dists->at(l) > reach_dists->at(r));
}
};
typedef priority_queue<size_t, vector<size_t>, CompareReachDist> pq;
vector<float> reach_dists;
int main()
{
pq seeds(CompareReachDist(&reach_dists));
bool isEmpty = seeds.empty();
return 0;
}
但是,在编译时出现错误:
error: request for member 'empty' in 'seeds', which is of non-class type 'pq(CompareReachDist&) {aka std::priority_queue<unsigned int std::vector<unsigned int>, CompareReachDist>(CompareReachDist&)}'
我哪里错了?
这是一个解析问题。让我们把它分开:
CompareReachDist(&reach_dists)
您可能认为这会创建一个临时 CompareReachDist
,其中包含静态 reach_dists
的地址。但在整个声明的上下文中,它被解释为对 CompareReachDist
的引用。奇怪,但那是因为,粗略地说,C++ 的语法更喜欢函数声明而不是对象声明。以下
pq seeds(CompareReachDist(&reach_dists));
是一个函数的整体声明。它接受一个 CompareReachDist&
和 returns 一个 pq
.
您收到的错误是因为,很明显,函数没有您可以调用的 empty
成员。
自 C++11 以来的解决方案是支持列表初始化,这打破了歧义及其作为函数声明的解析。所以你可以这样做:
pq seeds{CompareReachDist{&reach_dists}};
并得到一个对象,正如人们所期望的那样。