gpt4 book ai didi

c++ - std::set 使用派生类对象,但使用 gcc8.1 进行基类比较

转载 作者:行者123 更新时间:2023-11-28 01:31:25 24 4
gpt4 key购买 nike

啊啊

#ifndef _A__
#define _A__
class A {
public:
struct Less {
bool operator() (const A* const &k1, const A* const &k2) const
{
return k1->_a < k2->_a;
}
};
A(int a) : _a(a)
{
;
}
virtual ~A()
{
;
}
private:
int _a;
};

#endif

b.h

#ifndef _B__
#define _B__
#include "a.h"

class B : public A {
public:
B(int a) : A(a)
{
;
}
~B()
{
;
}
};

#endif // _B__

c.cpp

#include <set>
#include "a.h"
class B;
class C
{
std::set<B*, A::Less> _set;
};

当 c.cpp 使用 g++ 8.1 编译时,编译失败并出现此静态检查错误

/export/dev6/rajpal/gcc/8.1.0/bin/g++ -c c.cpp
In file included from /export/dev6/rajpal/gcc/8.1.0/include/c++/8.1.0/set:60,
from c.cpp:1:
/export/dev6/rajpal/gcc/8.1.0/include/c++/8.1.0/bits/stl_tree.h: In instantiation of 'class std::_Rb_tree<B*, B*, std::_Identity<B*>, A::Less, std::allocator<B*> >':
/export/dev6/rajpal/gcc/8.1.0/include/c++/8.1.0/bits/stl_set.h:133:17: required from 'class std::set<B*, A::Less>'
c.cpp:6:25: required from here
/export/dev6/rajpal/gcc/8.1.0/include/c++/8.1.0/bits/stl_tree.h:452:21: error: static assertion failed: comparison object must be invocable with two arguments of key type
static_assert(__is_invocable<_Compare&, const _Key&, const _Key&>{},
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我理解错误是因为在编译时,编译器无法确定如何比较 _Key=B*如果我提供 B 的定义,它应该工作得很好。

但是,我的问题是是否有任何方法可以告诉编译器 B实际上源自A并且有一种方法可以比较A对象。

另请注意,我不想更改 std::set<B*, A::Less>std::set<A*, A::Less>这也应该解决这个问题。

最佳答案

好吧,这实际上是一个 libstdc++ 错误,将在 GCC 8.4 中修复: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85965

关于c++ - std::set 使用派生类对象,但使用 gcc8.1 进行基类比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51389010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com