【发布时间】:2019-06-04 05:49:36
【问题描述】:
一个简单的C++ OO问题重载模板和运算符重载:在下面的类中,我已经重载了两次索引运算符:
template<class A, class B>
class test
{
A a1;
B a2;
public:
A& operator[](const B&);
B& operator[](const A&);
};
现在,如果我用相同的类型名实例化这个模板类的一个对象:
test<int, int> obj;
调用索引运算符将导致错误,因为两个重载函数将具有相同的签名。
有没有办法解决这个问题?
对不起,如果这是一个基本问题。我还在学习!
【问题讨论】:
-
您可以使用
std::enable_if,并且仅在A和B类型不同时才启用第二次重载 -
我认为这更像是一个设计/分析/需求问题,您需要退后一步来避免此类问题。是的,您可以通过“hacks”来缓解或解决代码本身的问题,但这种解决方法往往不太理想,并且会使代码更难理解和(更重要的是)维护。
-
这将是
typename std::enable_if<!std::is_same_v<A, B>, B>::type operator[](const A&);IIRC。 -
这是x y problem。你到底想做什么?
-
@MatthieuBrucher 为什么不把它作为一个答案呢?
标签: c++ class templates operator-overloading