实现运算符<< 带有类::工厂();

Implementing operator<< with a class::factory();

本文关键字:lt 工厂 运算符 实现      更新时间:2023-10-16

我有一个泛型(纯虚拟接口)类IFACE,以及一些处理IFACE所有子类的类,如下所示:

class IFACE{
};
class A{
public:  
   A& operator<<(IFACE& other);      
};

使用以下代码一切正常:

class B:IFACE{
};

但不能使用工厂方法,如下所示:

class C:IFACE{
  static C factory(){
    C c;
    return c;
  }
}
与可执行

:

int main(){
  A a;
  B b;
  C c;
  C cc = C::factory();
  a<<b;               //Ok ...
  a<<c;               //Also ok...
  a<<cc;              //Again ok ...
  a<<C::factory();    //error below
  return 0;
}

error: no match for ‘operator<<’ in ‘A << C::factory()()’

也失败了(同样的错误):

 a<<(C::factory());

现在,下面的工作:a<<&(C::factory());,但给出了一个关于获取临时地址的警告。我认为这是不安全的,因为我无法控制C::factory()的匿名结果何时会超出范围。这不安全吗?

所以我的下一个想法是:

class A{
  A& operator<<(IFACE* ifp);
  template<typename T>
  A& operator<<(T t){
    IFACE* ifp = static_cast<IFACE*>(&t);
    return (*this)<<ifp;
  }
}

编译良好,但从上面链接main给出错误:

undefined reference to 'A& A::operator<< <C>(C)'

这怎么可能是未定义的?

编辑:

有人建议我实现:

A& A::operator<<(const IFACE& other)

但是这也不会编译…我得到以下错误:

error: passing ‘const IFACE’ as ‘this’ argument of ‘virtual int <some method in IFACE>’ discards qualifiers

更新:

Eser对问题原因的判断是正确的,但对解决方法却不正确。为了解决这个问题,您所要做的就是使引用常数:operator<<(const iFACE&)。现在你的操作符也可以使用临时值了。

偏离主题:您可以轻松地执行return C(),而不是执行C c; return c;,具有相同的结果,但是少了一行,并且可能更容易编译器优化。:)