我正在尝试开发一个简单的记录器。
我有一个带有以下原型的函数:
class Logger{
public:
std::unique_ptr<MyStream> & getLogger(string, string);
}
我希望做类似
的事情logger = Logger();
logger.log("INF", "HGH") << "My message" << endl;
为此我重载了运算符&lt;&lt;
template<typename T>
inline friend std::unique_ptr<MyStream> &operator<<(std::unique_ptr<MyStream>&os, const T&val){
*os << val;
return os;
}
inline friend std::unique_ptr<MyStream>& operator<<(std::unique_ptr<MyStream>&os, std::ostream&(*f)(std::ostream&) ){
*os << f;
return os;
}
但是当我尝试做的时候
auto infLogger = log.log(M_LOG_NRM, M_LOG_INF);
infLogger<< "Testing new functionality" << std::endl;
一切正常,但是当我这样做时:
log.log("MOD1", M_LOG_NRM, M_LOG_INF) << "Testing new functionality" << std::endl;
我有一个很好的编译错误:
cannot convert ‘jpCppLibs::Logger::log(int, int)(std::basic_string<char>(((const char*)"MOD1"), (*(const std::allocator<char>*)(& std::allocator<char>()))), 3, 3)’ (type ‘std::unique_ptr<jpCppLibs::MyStream>’) to type ‘std::unique_ptr<jpCppLibs::MyStream>&’
log.log(M_LOG_NRM, M_LOG_INF) << "Testing new functionality" << std::endl;
任何帮助?
该类正在通过参数传递消息和格式+变量,只是尝试稍微改进一下
答案 0 :(得分:1)
因为您正尝试使用初始化非const引用 暂时的,这是不允许的。
这个问题的通常解决方案是写一个小班
(可能只包含您的std::unique_ptr
),
使用模板成员operator<<
;规则允许成员
在临时函上调用的函数。
答案 1 :(得分:1)
template<typename T>
inline friend std::unique_ptr<MyStream> const&operator<<(std::unique_ptr<MyStream> const&os, const T&val){
*os << val;
return os;
}
请注意,std::unique_ptr<MyStream> const&
和std::unique_ptr<MyStream const>&
是不同的类型。第一个是对可变数据的不可变智能指针的引用,第二个是对可变数据的可变智能指针的引用。
临时对象无法绑定到非const
左值引用,因为可以防止隐式转换导致更改被静默丢弃。但是,您不需要非const
左值引用,因此没有问题。