Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;“多重重载”;使用具有重复类型的模板化类_C++_C++11_Templates_Overloading - Fatal编程技术网

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));