c++ - 使用 class::factory(); 实现 operator<<

标签 c++ templates operator-overloading

我有一个通用(纯虚拟接口(interface))类 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&) .现在您的运算符(operator)也可以使用临时工。

题外话:而不是做 C c; return c;你可以很容易地做到return C() ,结果相同,但少了一行,编译器可能更容易优化。 :)

关于c++ - 使用 class::factory(); 实现 operator<<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8639816/

相关文章:

c++ - 如果未定义的 C++ 行为符合 C 定义的行为会发生什么?

C++ 方法 : Non-template class inheriting from an abstract specialized template

c++ - "Curiously Recurring Template Pattern"的实际用途

C++ 重载运算符 << 让我做噩梦

c++ - 运算符重载 C++

c++ - 指向 DLL 中回调的指针

c++ - 如何在 Visual Studio 中启用 C++17 编译?

c++ - 无法使用 cmake + vcpkg 在 VS Code 中包含 C++ 项目的库

java - Play Framework : how to use "moreStyles" and "moreScripts"

c# - 重写 C# 的 Monitor.Enter 和 Monitor.Exit