- 主题:一个构造函数的问题
今天在看优先队列,看官网给的例子,初始化有个奇怪的问题。代码如下:
class mycomparison
{
bool reverse;
public:
mycomparison(const bool& revparam=false)
{reverse=revparam;}
bool operator() (const int& lhs, const int&rhs) const
{
if (reverse) return (lhs>rhs);
else return (lhs<rhs);
}
};
int main ()
{
typedef std::priority_queue<int,std::vector<int>,mycomparison> mypq_type;
mypq_type fifth; //使用默认构造函数
mypq_type fifth (mycomparison(true)); // 有问题
fifith.push(0);
return 0;
}
如果把有问题那一行true去掉,使用默认构造函数,那下一行push那句就编译不过。怎么回事?例子给的使用默认构造函数是
--
修改:GoGoRoger FROM 222.129.50.*
FROM 222.129.50.*
去掉也没用,问题不在这里。
【 在 z16166 的大作中提到: 】
: push那行你typo了吧,多了个字母i
: --
:
: ...................
--
FROM 36.112.189.*
我用的这里提供的例子和
http://cpp.sh/的在线编译器,以及在本机win7下mingw的编译器,都有报错。
http://www.cplusplus.com/reference/queue/priority_queue/priority_queue/
@DoorWay @allegro
【 在 z16166 的大作中提到: 】
: 我去掉能编译通过的呀。两种构造都能pass。
: VS2022,默认用C++14
:
--
FROM 222.129.50.*
用你这个编译器貌似也是有问题,不知道你们怎么编译过的。。。
【 在 z16166 的大作中提到: 】
: 在线编译器用这个
:
https://godbolt.org/:
--
FROM 222.129.50.*
// constructing priority queues
#include <iostream> // std::cout
#include <queue> // std::priority_queue
#include <vector> // std::vector
#include <functional> // std::greater
class mycomparison
{
bool reverse;
public:
mycomparison(const bool& revparam=false)
{reverse=revparam;}
bool operator() (const int& lhs, const int&rhs) const
{
if (reverse) return (lhs>rhs);
else return (lhs<rhs);
}
};
int main ()
{
int myints[]= {10,60,50,20};
std::priority_queue<int> first;
std::priority_queue<int> second (myints,myints+4);
std::priority_queue<int, std::vector<int>, std::greater<int> >
third (myints,myints+4);
// using mycomparison:
typedef std::priority_queue<int,std::vector<int>,mycomparison> mypq_type;
mypq_type fourth; // less-than comparison
fourth.push(0);
mypq_type fifth(mycomparison()); // greater-than comparison
fifth.push(1);
std::cout << fifth.top() << std::endl;
return 0;
}
--
FROM 222.129.50.*
嗯,我也是这么想的,但是还是说明编译器理解有问题吧?
【 在 cybereagle 的大作中提到: 】
: 看错误信息啊
: 在这个地方 mycomparison() 会被当成一个函数指针 mycomparison (*)()
: 用mycomparison{} 可以
--
FROM 222.129.50.*
关键是构造成功了,却在push的时候出错,而且提示极不可读,太复杂了。
【 在 DoorWay 的大作中提到: 】
: 这是一个著名的问题,有个专门的名字叫 most vexing parsing
:
: Effective STL 第六节 和 Effective Modern CPP 第七节里都提到过。
: ...................
--
修改:GoGoRoger FROM 222.129.50.*
FROM 222.129.50.*
抛开你说的这些,这不是很明显编译器的一个错误吗?
【 在 DoorWay 的大作中提到: 】
: 与人类真实世界一样,出生(构造)与死亡(析构)是最值得关注的话题。
:
: 类似的还有:
: ...................
--
FROM 222.129.50.*