2011-12-14 1 views
0

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

    .... 

} 

То, что я пытаюсь сделать, это абстрактный объект компаратора, так что я могу определить пользовательский типологических заказы для сортировки OSET с.

Спасибо!

ответ

2

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

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

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

+0

спасибо! 10char –

0

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

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

+0

oh woops i ment для этого, чтобы быть чувствительной к регистру версией, а не игнорировать случай, позвольте мне исправить это –

+0

, поэтому я добавил код, нечувствительный к регистру. также выясняется, что у меня был тип в основном, о котором вы указали. Я исправил этот тип и получил новую ошибку. Я изменил информацию, которую я даю, чтобы решить эту проблему. –

0

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

+0

поэтому я исправил эту ошибку в моем вопросе, у меня также был тип, теперь моя ошибка выглядит следующим образом: error: 'oset , std :: allocator >> :: Компаратор 'является недоступной базой «CaseSensitive» –

+2

@GarrettRosenblatt: вам нужно наследовать ** public ** -ally, чтобы иметь возможность использовать указатель на базу. - Когда вы наследуете конфиденциально (по умолчанию для классов), это означает, что это отношение наследования является лишь деталью реализации, о которой не знает весь остальной мир. – UncleBens

+0

wait, так где мне нужно добавить общедоступное ключевое слово? спасибо –

Смежные вопросы