我有一个日志记录类,它不能继承std :: ostream,并且运算符<<已定义为与标准输出流相同的类型PLUS模板化版本:
class MyLoggingClass {
[...]
public:
template<typename T> MyLoggingClass & operator<<( T& data ){ ... }
}
Run Code Online (Sandbox Code Playgroud)
此外,对于我的程序中的每个可打印类,我都定义了典型的非成员函数:
std::ostream & operator << ( std::ostream & os, const OneOfMyClasses & foo );
Run Code Online (Sandbox Code Playgroud)
问题是,在内部,我的记录器有时使用标准输出流,这是:
template<typename T>
MyLoggingClass & operator<<( T& data )
{
[...]
if( someCondition )
{
cout << data;
}
[...]
}
Run Code Online (Sandbox Code Playgroud)
多亏了这一点,我可以记录我的类,而无需在每个类上显式复制非成员运算符<< for MyLoggingClass.问题出现在我尝试记录"动态"创建的对象的行中:
MyLoggingClass logger;
logger << OneOfMyClasses(params); // Here I am invoking the constructor of class "OneOfMyClasses"
Run Code Online (Sandbox Code Playgroud)
问题是,不是调用构造函数,而是将对象作为运算符<<的参数传递,它解释我正在尝试将指针记录到函数.
当然,针对此问题的一些有效解决方案包括: