dun*_*dar 2 c++ templates operator-overloading
我有一个日志记录类,它不能继承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)
问题是,不是调用构造函数,而是将对象作为运算符<<的参数传递,它解释我正在尝试将指针记录到函数.
当然,针对此问题的一些有效解决方案包括:
提前谢谢您的时间:)
我认为这是问题所在:
template<typename T> MyLoggingClass & operator<<( T& data ){ ... }
Run Code Online (Sandbox Code Playgroud)
data 是非const引用和行:
logger << OneOfMyClasses(params);
Run Code Online (Sandbox Code Playgroud)
试图将临时绑定到非const引用.
改成:
template<typename T> MyLoggingClass & operator<<(const T& data ){ ... }
//^^^^^
Run Code Online (Sandbox Code Playgroud)