Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未在优先权队列C+的作用域友元比较器类中声明+;_C++_Templates_Stl_Priority Queue_Friend - Fatal编程技术网

C++ 未在优先权队列C+的作用域友元比较器类中声明+;

C++ 未在优先权队列C+的作用域友元比较器类中声明+;,c++,templates,stl,priority-queue,friend,C++,Templates,Stl,Priority Queue,Friend,首先让我浓缩相关代码,注意产生错误的参数movies: // ActorGraph.hpp class ActorGraph { protected: class Movie; // definition further below friend class MovieYearComparator; int func(..., priority_queue<Movie, vector<Movie>, MovieYearComparator> &a

首先让我浓缩相关代码,注意产生错误的参数
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.hpp
类动作图
{
受保护的:
类Movie;//定义如下
朋友级电影年比较器;
int func(…,优先级队列和电影);
班级电影{…};
};
在实施文件中,我们有:

// 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) 
{...}
//ActorGraph.cpp
类电影年比较器
{
公众:
布尔运算符()(常量ActorGraph::Movie a,常量ActorGraph::Movie b)常量
{
//比较运算
}
};
ActorGraph::func(…,优先级队列和电影)
{...}

但是,g++抱怨称,未在此范围内声明
MovieYearComparator
,这是指
func
声明。我拼写正确,这个范例适用于文件中的其他容器,而不是优先级队列。请注意,
Movie
是一个非常小的类,因此我选择按值传递它。

当您正向声明一个类时,您不能用它做任何事情,您只有使用/存储引用或指向它的指针的权利,例如:

struct A;

struct B {
    A *_a; // Ok
    B (A &a) : _a(&a) { } // Ok
};

void f (A a) { } // Oops!
原因很简单:如果不使用引用或指针,编译器在使用它时必须知道结构的大小

在您的情况下,
priority\u queue
需要使用
Comparer
的非引用,但是由于您第一次实例化模板(在
ActorGraph
的定义中)您的
Comparer
MovieYearComparator
)不是一个完整的类型,
priority\u 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 {...};
};

还要注意的是,由于
MovieYearComparator
现在是
ActorGraph
的一个内部类,您不需要将其设置为好友类。

尝试包含MovieYearComparator头文件该类没有头文件。实现细节在
ActorGraph.cpp
中,其中包括
ActorGraph.hpp
其中
MovieYearComparator
被声明为类ActorGraph之上的friendTry“class MovieYearComparator”,并尝试将其置于
ActorGraph
之上,但由于
操作符()的参数,它无法编译
要求type@jeanluc只能对指针或引用使用前向声明的类型;但现在编译器应该知道
MovieYearComparator
for
func
。我明白了,这很有意义。然而,我试图保持头文件尽可能干净,我不知道如何在实现文件中保持
MovieYearComparator
。我是否应该使用更好的范例,或者我应该将其吸收并放在标题中?@jeanluc您只能在标题中定义类,但在您的cpp文件中实现
操作符()
。如果使用
结构
,标题中的代码将占用大约4行(请参见我的编辑)。
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 { }