2014-05-19 2 views
0

У меня есть контейнер курсов * (курсор, конечно), и я пытаюсь искать курс в счетчике по его номеру курса! но ниже код не работаетКак найти элемент из контейнера указателей?

const Course findCourse(const int number) const 
{ 
    Container<Course*, std::allocator<Course*> >::iterator ret_iterator = 
     std::find_if(courses.begin(), courses.end(), FindFromPointer(number)); 

    if (ret_iterator == courses.end()){ 
     return Course::DUMMY_COURSE; 
    } 

    return *(ret_iterator); 
} 

struct FindFromPointer 
{ 
    FindFromPointer(int i) : n(i) { } 
    bool operator()(Course * course) const { return n == course->getNumber(); } 
private: 
    int n; 
}; 

** контейнер: это график, который имеет емкость курсов, определенные выше, что означает, что я класс ведьма содержит Сетевой график контейнер указателя курсов **

template <template <class, class> class Container> 
class Schedule { 
public: 
    //<somthing> 
    //. 
    //. 
private: 
Container<Course*, std::allocator<Course*> > courses; 
+2

"_Doesn't work_" не является полезным сообщением о неисправности. Что вы пробовали? Какие результаты вы ожидали? и что вы получили? – Rook

+0

Я пытаюсь найти курс по этому курсу (это ключ), в контейнере, у которого есть указатели на курсы! функция вернет элемент, если он будет создан, иначе он будет хорошо возвращать DUMMY_course, основным классом будет расписание, в котором есть контейнер элементов класса (выше) – user3603520

+0

'return * (ret_iterator);' - '* (ret_iterator)' является указатель на «курс», но функция 'findCourse' возвращает сам курс. – borisbn

ответ

2

Возврат *(ret_iterator) из функции findCourse вызывает ошибку компиляции, поскольку *(ret_iterator) является указателем на Course. Итератор operator* возвращает ссылку на элемент контейнера, а элемент вашего контейнера - указатель на Course. Правильный код должен быть таким:

return *(*ret_iterator); 

или более ясно:

Course * ret_pointer = *ret_iterator; 
return * ret_pointer; 

Другая проблема: функция findCourse объявлена ​​как const, поэтому все члены класса Schedule являются const внутри этой функции. Когда вы вызываете std::find_if с courses.begin(), вызывается версия const begin(). Он возвращает const_iterator и std::find_if возвращает const_iterator соответственно. Но ... вы назначаете его итератору, и он должен вызывать ошибку компилятора. Правильный код:

Container<Course*, std::allocator<Course*> >::const_iterator ret_iterator = 
    std::find_if(courses.begin(), courses.end(), FindFromPointer(number)); 

или вы можете удалить const классификатор из декларации findCourse.

+0

ошибка C2440: 'initializing': не может преобразовать из 'std :: _ List_const_iterator >>' to 'std :: _ List_iterator >>' Никакой конструктор не мог взять тип источника, или разрешение перегрузки конструктора было неоднозначным. 1> c: \ users ... \ schedule.h (100): при компиляции функции члена класса шаблона 'const Расписание занятий :: findCourse (const int) const '- – user3603520

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