Недопустимое использование неполного типа / предварительное объявление ошибок. возможно неправильное использование абстрактного класса? (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(),

Другие вопросы по тегам