的模板函数参数
问题描述:
懒惰的评价我有记录的一类,一定不能继承的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;” 但是,我想知道是否有办法强制编译器评估构造函数调用。你知道这种情况下的解决方法吗?
预先感谢您的宝贵时间:)
答
我觉得这是问题是:
template<typename T> MyLoggingClass & operator<<(T& data){ ... }
data
是非const引用和行:
logger << OneOfMyClasses(params);
正试图将临时绑定到非常量引用。
更改为:
template<typename T> MyLoggingClass & operator<<(const T& data){ ... }
//^^^^^
难道周围构造额外的括号来解决?即'记录器 2012-01-12 14:12:24
哦,我忘了提及它。不,它不起作用:S – dunadar 2012-01-12 14:16:22