我想说的是,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/