我有一个用于记录的类,它不能继承std :: ostream,并且有运算符<<为与标准输出流PLUS模板化版本相同的类型定义:
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;
}
[...]
}
由于这个原因,我可以记录我的类,而无需在每个类上明确地复制非成员运算符&lt;&lt;对于MyLoggingClass。 问题来自于我尝试记录“动态”创建的对象:
MyLoggingClass logger;
logger << OneOfMyClasses(params); // Here I am invoking the constructor of class "OneOfMyClasses"
问题是,不是调用构造函数,而是将对象作为运算符&lt;&lt;的参数传递,它解释我正在尝试将指针记录到函数。
当然,针对此问题的一些有效解决方案包括:
提前感谢您的时间:)
答案 0 :(得分:6)
我认为这是问题所在:
template<typename T> MyLoggingClass & operator<<( T& data ){ ... }
data
是非const引用和行:
logger << OneOfMyClasses(params);
正在尝试将临时绑定绑定到非const引用。
更改为:
template<typename T> MyLoggingClass & operator<<(const T& data ){ ... }
//^^^^^