Проблема рекурсии с перегрузкой оператора - PullRequest
3 голосов
/ 04 мая 2010

У меня есть это:

typedef string domanin_name;

А потом я пытаюсь перегрузить оператор <таким образом: </p>

bool operator<(const domain_name & left, const domain_name & right){
    int pos_label_left = left.find_last_of('.');   
    int pos_label_right = right.find_last_of('.');

    string label_left = left.substr(pos_label_left);
    string label_right = right.substr(pos_label_right);
    int last_pos_label_left=0, last_pos_label_right=0;

    while(pos_label_left!=string::npos && pos_label_right!=string::npos){
        if(label_left<label_right) return true;
        else if(label_left>label_right) return false;

        else{
            last_pos_label_left = pos_label_left;
            last_pos_label_right = pos_label_right;

            pos_label_left = left.find_last_of('.', last_pos_label_left);
            pos_label_right = right.find_last_of('.', last_pos_label_left);

            label_left = left.substr(pos_label_left, last_pos_label_left);
            label_right = right.substr(pos_label_right, last_pos_label_right);
        }
    }
}

Я знаю, что это странный способ перегрузить оператор <, но я должен сделать это следующим образом. Это должно делать то, что я хочу. Дело не в этом. </p>

Проблема в том, что он входит в бесконечный цикл прямо в этой строке:

if(label_left<label_right) return true;

Похоже, что он пытается использовать эту функцию перегрузки для сравнения, но label_left - это строка , а не доменное имя !

Есть предложения?

Ответы [ 3 ]

12 голосов
/ 04 мая 2010

typedef просто дает другое имя для типа. Он не создает отдельный тип. Таким образом, вы перегружаете operator < для string.

Если вы хотите создать отдельный тип, вы можете попробовать

struct domain_name {
   string data;
   // ...
};

и работайте с этим.

3 голосов
/ 04 мая 2010

Typedef не работает так. Typedef просто определяет псевдоним для типа - это все еще строка. Для этого вам потребуется новый тип. Вы должны сделать это в любом случае. Ваш оператор перегружает оператор сравнения для всех строк.

1 голос
/ 04 мая 2010

Ваш typedef не создает новый тип. Он просто создает новое имя для ссылки на тот же тип, что и раньше. Таким образом, когда вы используете < внутри своей операторной функции для двух строк, компилятор просто использует тот же оператор, который компилирует, потому что типы аргументов совпадают.

Вместо этого вы можете захотеть определить совершенно новую функцию:

bool domain_less(domain_name const& left, domain_name const& right);

Затем используйте эту функцию в местах, которые вызывают функцию сравнения, например, std::sort. Большинство стандартных алгоритмов будут использовать < по умолчанию, но вместо этого вы сможете предоставить свою собственную функцию предиката. Возможно, вам придется использовать std::ptr_fun для переноса вашей функции. Вы также можете написать свой собственный объект функтора; в этом случае типично спуск с std::binary_function. (Проверьте заголовок <functional>.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...