未在范围内声明 - priority_queue C++的友元比较器类
Not declared in scope - friend comparator class for priority_queue C++
首先让我压缩相关代码,注意产生错误的参数movies
:
// ActorGraph.hpp
class ActorGraph
{
protected:
class Movie; // definition further below
friend class MovieYearComparator;
int func(..., priority_queue<Movie, vector<Movie>, MovieYearComparator> &movies);
class Movie {...};
};
在实现文件中,我们有:
// ActorGraph.cpp
class MovieYearComparator
{
public:
bool operator() (const ActorGraph::Movie a, const ActorGraph::Movie b) const
{
// comparison operation
}
};
ActorGraph::func(..., priority_queue<Movie, vector<Movie>, MovieYearComparator> &movies)
{...}
但是,g++ 抱怨MovieYearComparator
没有在此范围内声明,指的是func
声明。我拼写正确,这种范式适用于文件中的其他容器,只是不适用于优先级队列。请注意,Movie
是一个非常小的类,因此我选择按值传递它。
当你转发声明一个类时,你不能用它做所有事情,你只有使用/存储引用或指向它的指针的权利,例如:
struct A;
struct B {
A *_a; // Ok
B (A &a) : _a(&a) { } // Ok
};
void f (A a) { } // Oops!
原因很简单:如果不使用引用或指针,编译器在使用时必须知道struct
/class
的大小。
在您的情况下,priority_queue
需要使用Comparer
的非引用,但是由于您第一次实例化模板(在ActorGraph
的定义中)您的Comparer
(MovieYearComparator
)不是一个完整的类型,priority_queue
无法实例化。
你需要在第一次实例化priority_queue
之前定义MovieYearComparator
类,例如:
class ActorGraph {
protected:
class Movie; // definition further below
class MovieYearComparator
{
public:
// Use reference since your forward-declare Movie
bool operator() (const ActorGraph::Movie const& a,
const ActorGraph::Movie const& b) const {
// comparison operation
}
};
int func(..., priority_queue<Movie, vector<Movie>, MovieYearComparator> &movies);
class Movie {...};
};
如果你想保持你的头"干净",你只能在头文件中定义类,但在 cpp 文件中实现operator()
:
class ActorGraph {
protected:
class Movie; // definition further below
struct MovieYearComparator {
bool operator() (const ActorGraph::Movie const& a,
const ActorGraph::Movie const& b) const;
};
int func(..., priority_queue<Movie, vector<Movie>, MovieYearComparator> &movies);
class Movie {...};
};
// .cpp
bool ActorGraph::MovieYearComparator::operator() (const ActorGraph::Movie const& a,
const ActorGraph::Movie const& b) const { }
另请注意,由于MovieYearComparator
现在是ActorGraph
的内部类,因此您不需要将其设置为友元类。
相关文章:
- C++模板来检查友元函数的存在
- 模板类无法识别友元运算符
- 如何使用单独文件中的派生类访问友元函数对象
- 模板化的类和友元函数
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- 如何在嵌套类中正确使用友元声明?
- 友元函数无法访问私有数据成员 (c++)
- 继承和友元函数,从基类访问受保护的成员
- 将子类方法声明为基类的友元
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- 在将函数声明为友元时,尖括号的含义是什么?
- 在模板类之外定义友元函数的正确方法是什么?
- 2个模板化类的非模板友元函数未定义引用错误
- 友元方法作为常量
- C++ 友元函数和私有构造函数
- 使第二个类的构造函数成为第一个类中的友元函数
- 在为嵌套类定义行外友元时,我真的必须打破封装吗?
- 未定义的类模板不会实例化以检查友元函数
- C++类中的友元函数有问题?
- 使用typedef'ed返回类型声明友元函数时出现编译器错误