【发布时间】:2012-01-12 14:07:51
【问题描述】:
我有一个用于记录的类,它不能继承 std::ostream,并且为与标准输出流相同的类型定义了 operator
class MyLoggingClass {
[...]
public:
template<typename T> MyLoggingClass & operator<<( T& data ){ ... }
}
另外,对于我程序中的每个可打印类,我都定义了典型的非成员函数:
std::ostream & operator << ( std::ostream & os, const OneOfMyClasses & foo );
问题是,在内部,我的记录器有时使用标准输出流,这是:
template<typename T>
MyLoggingClass & operator<<( T& data )
{
[...]
if( someCondition )
{
cout << data;
}
[...]
}
多亏了这一点,我可以记录我的类,而无需在每个类上显式复制 MyLoggingClass 的非成员运算符
MyLoggingClass logger;
logger << OneOfMyClasses(params); // Here I am invoking the constructor of class "OneOfMyClasses"
问题是,它不是调用构造函数,然后将对象作为运算符的参数传递
当然,这个问题的一些有效解决方案包括:
- 移除模板化操作符
- 删除模板化运算符
- 将要登录的对象存储在一个时间变量中,然后执行“logger
提前感谢您的宝贵时间:)
【问题讨论】:
-
可以通过构造函数周围的额外括号来解决吗? IE。
logger << (OneOfMyClasses(params)); -
哦,我忘了说。不,它不起作用:S
标签: c++ templates operator-overloading