我有这个:
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是字符串,而不是域名!
有什么建议吗?
答案 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>
标题。)