C++ &引用;“多重重载”;使用具有重复类型的模板化类
我正在尝试编写一个包含两种模板类型的类。此类继承自接口。请参阅下面的代码C++ &引用;“多重重载”;使用具有重复类型的模板化类,c++,c++11,templates,overloading,C++,C++11,Templates,Overloading,我正在尝试编写一个包含两种模板类型的类。此类继承自接口。请参阅下面的代码 #include <iostream> #include <string> template <typename T> class IObserver { public: virtual void Next(const T& value) noexcept = 0; }; template <typename T1, typename T2> class B
#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);
}
#包括
#包括
模板
类IObserver{
公众:
虚拟空下一个(常数T和值)noexcept=0;
};
模板
类BinaryObserver:公共IObserver,公共IObserver{
公众:
void Next(const T1&value)noexcept override{};
void Next(const T2&value)noexcept override{};
};
int main(){
//这没关系
二元观察者mc1;
mc1.Next(0);
mc1.Next(0.0f);
//无法使用“多个重载”进行编译
二元观察者mc2;
mc2.Next(0);
mc2.Next(0);
}
当T1
与T2
类型相同时,我遇到了问题。显然,这意味着将生成两个具有相同类型的Next
函数,这会产生一个错误:多个重载的“Next”实例化为同一签名
解决这个问题的惯用方法是什么?我不知道如何处理T1=T2的情况,因为我只需要生成一个Next
函数
谢谢 专业化如何:
template <typename T>
class BinaryObserver<T, T> : public IObserver<T> {
public:
void Next(const T & value) noexcept override{};
};
模板
类BinaryObserver:公共IObserver{
公众:
void Next(const T&value)noexcept override{};
};
您的程序中还有另一个问题:
BinaryObserver<int, int> mc2;
mc2.Next(0);
mc2.Next(0);
另一种可能是将T
s中的一个放入另一个容器中。我在本例中使用了Shell结构:
模板
结构壳{
T;
壳(T):T(T){}
运算符T()常量{return T;}
};
模板
类BinaryObserver:公共IObserver,公共IObserver{
公众:
void Next(const T1&value)noexcept override{T1 t=value;};
void Next(const Shell&value)noexcept override{t2t=value;};
};
...
二元观察者mc1;
mc1.Next(0);
mc1.Next(0.0f);
二元观察者mc2;
mc2.Next(0);
mc2.Next(Shell(0));
这不仅仅是多个重载(如果magic,您可以使用一些enable\u来修复),而且您还从同一个基类派生了两次,这也是不允许的@VTT的答案解决了这两个问题。
class BinaryObserver : public IObserver<T1>, public IObserver1<T2>
...
mc2.Next(0);
mc2.Next1(0);
template <typename T1, typename T2>
class BinaryObserver : public IObserver<T1>, public IObserver<Shell<T2>> {
public:
void Next(const T1& value) noexcept override{T1 t = value;};
void Next(const Shell<T2>& value) noexcept override{T2 t = value;};
};
...
BinaryObserver<int, float> mc1;
mc1.Next(0);
mc1.Next(0.0f);
BinaryObserver<int, int> mc2;
mc2.Next(0);
mc2.Next(Shell<int>(0));