Недопустимое использование неполного типа / предварительное объявление ошибок. возможно неправильное использование абстрактного класса? (C++)
Теперь я получаю ошибку:
error: ‘oset<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::Comparator’ is an inaccessible base of ‘CaseSensitive’
Я пытался выяснить проблему в течение нескольких часов безрезультатно, надеюсь, один из вас, ребята, сможет мне помочь. соответствующий код ниже:
template <class T>
class oset;
template <class T>
class oset {
....
public:
class Comparator {
public:
virtual ~Comparator() {}
virtual int compare(T, T) = 0;
};
private:
Comparator *comp;
....
public:
// new empty set:
oset(Comparator*);
....
};
....
class CaseSensitive : oset<string>::Comparator
{
public:
virtual ~CaseSensitive(){}
virtual int compare(string str1, string str2)
{
return strcmp(str1.c_str(), str2.c_str());
}
};
....
int main() {
oset<string>::Comparator *cs = new class CaseSensative();
//error in line above
....
}
То, что я пытаюсь сделать, это создать абстрактный объект Comparator, чтобы я мог определять пользовательские типологические порядки для сортировки по oset.
Спасибо!
3 ответа
Вы наследуете в частном порядке от Comparator
, так что наследственные отношения не доступны внешним членам и друзьям класса. В частности, это предотвращает CaseSensitive*
в Comparator*
, Вы, вероятно, хотите наследовать публично:
class CaseSensitive : public oset<string>::Comparator // added "public"
{
// members here
};
Если не указано иное, члены и базовые классы class
являются private
; и те из struct
являются public
,
Вы должны включить CaseSensative в свой вопрос. Если только это не проблема.
Так должно быть new CaseSensative()
(который пишется как "чувствительный", BTW), и полное определение этого класса должно быть доступно (вы, скорее всего, не включили заголовок, который его определяет).
Ну, или вы определили один класс и попробуйте использовать несуществующий, в этом случае он должен быть new IgnoreCase()
,