【发布时间】:2018-09-22 16:36:13
【问题描述】:
我正在尝试编写一个采用两种模板类型的类。这个类继承自一个接口。请参阅下面的代码。
#include <iostream>
#include <string>
template <typename T>
class IObserver {
public:
virtual void Next(const T& value) noexcept = 0;
};
template <typename T1, typename T2>
class BinaryObserver : public IObserver<T1>, public IObserver<T2> {
public:
void Next(const T1& value) noexcept override{};
void Next(const T2& value) noexcept override{};
};
int main() {
// This is OK
BinaryObserver<int, float> mc1;
mc1.Next(0);
mc1.Next(0.0f);
// This fails to compile with "multiple overloads"
BinaryObserver<int, int> mc2;
mc2.Next(0);
mc2.Next(0);
}
当T1 与T2 的类型相同时,我遇到了问题。显然这意味着将生成两个具有相同类型的Next 函数,这会给出错误:multiple overloads of 'Next' instantiate to the same signature。
解决此问题的惯用方法是什么?我不确定如何处理 T1=T2 时的情况,因为我只需要生成一个 Next 函数
谢谢!
【问题讨论】:
-
这不仅仅是多重重载(你可以用一些
enable_if魔法修复),而且你还从同一个基类派生了两次,这也是不允许的。 @VTT 的回答解决了这两个问题。
标签: c++ c++11 templates overloading