c++ - 过载解析的问题

标签 c++ operator-overloading overload-resolution

我想说的是,SO 上已经有大量 C++ 重载问题,但在查看它们以及论坛和新闻组上的其他帖子一个小时后,我仍然感到困惑。

背景

我创建了一个命名空间,称之为 A,其中一堆类具有相同的实现 < 运算符的方法。为了避免代码重复,我这样写:

namespace A{
     template<typename T>
     bool operator< (const T&, const T&);
}

在名为 operator_forwards.h 的头文件中以及一些其他声明。 然后我通过添加如下一行使其成为正确类的 friend :

//example.h
#include "operator_forwards.h"
namespace A{
    template<typename T>
    class Example{
        public:
        friend bool operator< <>(const Example<T>&, const Example T&);
        private:
        T start;
    };
} 

最后,我将定义放在一个名为 operators.h 的文件中,如下所示:

namespace A{
    template<typename T>
    bool operator<(const T& lhs, const T& rhs){
        using std::operator<;
        return lhs.start<rhs.start;
    }
}

并将所有内容包含在一个头文件中:

//A.h
#include "example.h"
#include "operators.h"

问题

问题是当我这样调用 operator< 时:

Example<vector<int>::iterator> ex1(**foo**);
Example<vector<int>::iterator> ex2(**bar**);
ex1<ex2;

它调用 A::operator< 很好,但是它递归地调用自己来做 ex1.start<ex2.start而不是查找更专业的 operator< for vector::iterator。导致错误 C2039:start 不是 vector::iterator 的成员。

有没有人对确保 A::operator< 为 ex1.start 调用正确的 operator< 有任何建议?

注意:大约有 20 个类使用 A::operator< 因此,如果我可以避免在每个类中分别定义它,那就太棒了。

最佳答案

我的拙见:不要那样做。

A::operator< 的实现相比,你必须在更多的地方处理这个问题。 . A 中任意位置的任何代码可能会被这个声称支持 operator< 的意外模板迷惑对于任何东西,但实际上只能在具有 start 的类型上执行它成员(member)。

在您的情况下,您要放置一个 friend在任何地方的每个相关类中声明。在这些类中简单地实现它几乎没有更多的代码。如果这冒犯了您对代码重复的敏感度,请考虑共享基类:

template <typename T>
class IterWrapper {
public:
    IterWrapper() {}
    explicit IterWrapper(T it) : start(it) {}

    bool operator< (const IterWrapper<T>& rhs) { return start < rhs.start; }
protected:
    T start;
};

关于c++ - 过载解析的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12124187/

相关文章:

c++ - 使用 LibVLC 在播放时保存流

c++ - 条件运算符(<、>)在 gsl 插值函数中不起作用

c++ - and, or, not vs &&, ||, !

c++ - 用于右值和左值情况的 [] 运算符的两个版本

c++ - 手动选择不明确的构造函数

c++ - 更改默认代码 Visual Studio 2015 Community

C++ 运算符 >> 重载

c++ - 从 "const T"返回 "T::operator+(const T& rhs) const"是好的做法吗?

c# - 通用扩展方法解析失败

c++ - 如何调用与成员函数同名的内联友元函数?