недопустимое использование неполного типа / предварительное объявление ошибок. возможно неправильное использование абстрактного класса? (C ++) - PullRequest
0 голосов
/ 15 декабря 2011

теперь я получаю сообщение об ошибке:

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 ]

2 голосов
/ 15 декабря 2011

Вы наследуете в частном порядке от Comparator, поэтому отношения наследования недоступны для участников и друзей класса.В частности, это предотвращает преобразование из CaseSensitive* в Comparator*.Вы, вероятно, хотите наследовать публично:

class CaseSensitive : public oset<string>::Comparator // added "public"
{
    // members here
};

Если не указано иное, членами и базовыми классами class являются private;и те из struct являются public.

0 голосов
/ 15 декабря 2011

Вы должны включить CaseSensative в свой вопрос.Если только это не проблема.

0 голосов
/ 15 декабря 2011

Это должно быть new CaseSensative() (что пишется как «чувствительный», кстати), и должно быть доступно полное определение этого класса (скорее всего, вы не включили заголовок, который его определяет).

Ну, или вы определили один класс и попробуйте использовать несуществующий, в этом случае он должен быть new IgnoreCase().

...