我有一个通用(纯虚拟接口)类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
更新: 这个问题仍未解决。
答案 0 :(得分:2)
Eser对问题的原因是正确的,但不是解决方案。为了解决这个问题,您所要做的就是使引用保持不变:operator<<(const iFACE&)
。现在,您的操作员也可以使用临时工。
偏离主题:而不是C c; return c;
,您可以轻松地执行return C()
,但结果相同,但编译器少一行,编译器可能更容易优化。 :)