2016-03-27 2 views
2

Я был алгоритмом кодирования графа, и я столкнулся с этой проблемой. В C++ 11 Я пытался создать структуру, как показано ниже,Перегрузка функции C++ с помощью «константы»

struct edges{ 
    int u , v , w ; 
    edges(){} 
    edges(int _u , int _v , int _w) { 
    u = _u , v = _v , w = _w ; 
    } 
    bool operator < (edges & r) { 
    return w < r.w ; 
    } 
}; 

Итак, я написал этот код, он успешно компилируется. Но когда я называю() функции, как показано ниже, зЬй :: рода

sort(arr , arr + M) ; // here arr is an array of edges with M elements 

Тогда я получаю ошибку компиляции, которая указывает на stl_algo.h номер строки . Я добавляю часть кода из stl_algo.h,

/// This is a helper function... 
    template<typename _RandomAccessIterator, typename _Tp> 
    _RandomAccessIterator 
    __unguarded_partition(_RandomAccessIterator __first, 
       _RandomAccessIterator __last, const _Tp& __pivot) 
    { 
     while (true) 
    { 
     while (*__first < __pivot) // 2242 number line 
     ++__first; 
     --__last; 
     while (__pivot < *__last) 
     --__last; 
     if (!(__first < __last)) 
     return __first; 
     std::iter_swap(__first, __last); 
     ++__first; 
    } 
    } 

Итак я нахожу решение в Интернете и получил один. Я должен перегружать оператор с Const ключевое слово, как показано ниже,

struct edges{ 
    int u , v , w ; 
    edges(){} 
    edges(int _u , int _v , int _w) { 
    u = _u , v = _v , w = _w ; 
    } 
    bool operator < (const edges & r) const { 
    return w < r.w ; 
    } 
}; 

Мой вопрос, почему я должен перегружать оператор с ключевым словом «», если постройки я называю зЬй :: рода функции()?

+0

@SamVarshavchik Я не мог найти такого требования в стандарте. Самое близкое из них: «Предполагается, что comp не будет применять какую-либо непостоянную функцию через разыменованный итератор». Он выглядит как дефект реализации, который '__pivot' создан' const'. –

+0

Какой компилятор/ОС? Кроме того, что такое 'arr'? Пожалуйста, предоставьте [mcve]. – Barry

+0

компилятор g ++ 11 и ОС - debian linux (ubuntu) –

ответ

2

< Оператор используется для сравнить два объектов, а объект, который передается с помощью параметра будет не может быть изменен, так что параметр должен быть Const.

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