【问题标题】:Recursion problem overloading an operator重载运算符的递归问题
【发布时间】:2010-05-04 18:58:02
【问题描述】:

我有这个:

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

我知道重载运算符

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

if(label_left<label_right) return true;

它似乎是在尝试使用这个重载函数本身来进行比较,但是 label_left 是一个字符串,而不是一个域名!

有什么建议吗?

【问题讨论】:

    标签: c++ operator-overloading


    【解决方案1】:

    typedef 只是为类型提供了另一个名称。它确实 not 创建了一个 distinct 类型。所以实际上,你正在为string 重载operator &lt;。

    如果你想创建一个独特的类型,那么你可以尝试

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

    并与之合作。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2011-01-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-14
          • 2010-12-23
          • 1970-01-01
          相关资源
          最近更新 更多