我有一个通用的(纯虚拟接口)类IFACE,以及一些类来处理IFACE的所有子类,如下所示:用class :: factory()实现operator <<;
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
更新: 此问题尚未解决。
[香草萨特的 - 最重要的const的候选人](http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ )。 – 2011-12-27 00:11:33
@Josh你在'operator <<'中使用的函数必须声明为常量;像这样:'return_type iTYPE :: func()const'。 – 2011-12-27 08:47:28