【问题标题】:Overload operator< for std::pair重载运算符 < 用于 std::pair
【发布时间】:2014-05-18 10:08:42
【问题描述】:

我想为 std::pair 类重载运算符

template <>
bool operator< (const std::pair<int, std::string>& lhs, const std::pair<int, std::string>& rhs) {
    return lhs.first > rhs.first || (!(rhs.first > lhs.first) && lhs.second < rhs.second); 
};

我收到以下错误:没有函数模板匹配函数模板专业化'operator

我也试过了:

template <>
bool std::pair<int, std::string>::operator< (const std::pair<int, std::string>& lhs, const std::pair<int, std::string>& rhs) {
    return lhs.first<rhs.first || (!(rhs.first<lhs.first) && lhs.second<rhs.second); 
};

这次我得到错误:overloaded 'operator

我该怎么做?

【问题讨论】:

  • 没有template &lt;&gt; 你的第一个版本应该没问题。
  • 第一个应该可以,但您不需要将其设为模板 - 尝试在开头省略 template &lt;&gt;
  • 另一个原因可能是(使用template &lt;&gt; 特化),您忘记使用-std=c++11 标志编译代码。
  • 覆盖背后的逻辑无效,因为它没有建立排序。尝试比较x={2,"A"}y={1, "B"}x&lt;yy&lt;x 的结果都是true,这意味着不能使用重载进行排序。
  • 即使编译了特化,您仍然应该更喜欢使用非模板函数重载:gotw.ca/publications/mill17.htm

标签: c++ operator-overloading


【解决方案1】:

你写的是模板专业化,它假设你之前已经定义了模板。

就像 cmets 中提到的那样,在这种情况下,您不需要使运算符重载模板,因为您已经专门化了 pair

【讨论】:

    猜你喜欢
    • 2015-08-18
    • 2021-10-25
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多