std :: set с объектом производного класса, но компаратором базового класса с gcc8.1

хиджры

#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> который также должен решить эту проблему.

-1

Решение

Но мой вопрос, есть ли способ сказать компилятору, что B на самом деле происходит от A

Единственный способ сделать это — дать определение B видно, где вам нужна эта информация.

Нет ничего лучше, чем предварительное объявление классов, указывающее, что B происходит от A,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]