2012-01-12 105 views
2

懒惰的评价我有记录的一类,一定不能继承的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; 
    } 
    [...] 
} 

多亏了这一点,我可以登录我的课没有明确地复制在每个人的非成员运算< <的MyLoggingClass。 这个问题是在一条线在那里我尝试登录创建的对象“对飞”:

MyLoggingClass logger; 
logger << OneOfMyClasses(params); // Here I am invoking the constructor of class "OneOfMyClasses" 

的事情是,而不是调用构造函数,然后传递对象为运营商<的参数它解释我试图记录一个指向函数的指针。

当然,对于这个问题的一些有效的解决方案包括:

  • 拆除模板操作< <,并使MyLoggingClass延长的std :: ostream的
  • 拆除模板操作< <,并创建吨非会员运营商< <(MyLoggingClass &,const OneOfMyClasses &)
  • 存储对象以登录时间变量le,然后做“记录器< < temporalObject;” 但是,我想知道是否有办法强制编译器评估构造函数调用。你知道这种情况下的解决方法吗?

预先感谢您的宝贵时间:)

+0

难道周围构造额外的括号来解决?即'记录器<<(OneOfMyClasses(params));' – 2012-01-12 14:12:24

+0

哦,我忘了提及它。不,它不起作用:S – dunadar 2012-01-12 14:16:22

回答

6

我觉得这是问题是:

template<typename T> MyLoggingClass & operator<<(T& data){ ... } 

data是非const引用和行:

logger << OneOfMyClasses(params); 

正试图将临时绑定到非常量引用。

更改为:

template<typename T> MyLoggingClass & operator<<(const T& data){ ... } 
               //^^^^^ 
+0

@BoPersson,谢谢并编辑。 – hmjd 2012-01-12 14:44:44

+0

你是对的:这是固定的事情。处理“遗留代码”的问题之一 - 从添加限定符后我必须修复的常量相关错误级联中解脱出来。 – dunadar 2012-01-12 15:05:57