递归问题重载运算符

时间:2010-05-04 18:58:03

标签: c++ operator-overloading

我有这个:

typedef string domanin_name;

然后,我尝试重载运算符<这样:

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);
        }
    }
}

我知道重载运算符&lt;是一种奇怪的方法,但我必须这样做。它应该做我想要的。这不是重点。

问题是它在这一行中进入无限循环:

if(label_left<label_right) return true;

似乎它正在尝试使用此重载功能本身来进行比较,但label_left是字符串,而不是域名

有什么建议吗?

3 个答案:

答案 0 :(得分:12)

typedef只为类型提供了另一个名称。 创建 distinct 类型。实际上,您为operator <重叠string

如果您想创建一个不同的类型,那么您可以尝试

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

并与之合作。

答案 1 :(得分:3)

Typedef不能像这样工作。 Typedef只是为类型定义了一个别名 - 它仍然是一个字符串。为此,您需要一个新类型。无论如何你应该这样做。您的运算符正在为所有字符串重载比较运算符。

答案 2 :(得分:1)

您的typedef不会创建新类型。它只是创建一个新名称来引用与以前相同的类型。因此,当您在两个字符串的运算符函数中使用<时,编译器只使用它编译的相同运算符,因为参数类型匹配。

您可能希望做的是定义一个全新的功能:

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

然后在需要比较功能的地方使用该功能,例如std::sort。大多数标准算法默认使用<,但允许您提供自己的谓词函数。您可能需要使用std::ptr_fun来包装您的函数。您也可以编写自己的仿函数对象;在这种情况下,通常从std::binary_function下降。 (查看<functional>标题。)