过载运算符<<从功能返回

时间:2014-05-06 12:21:24

标签: c++

我正在尝试开发一个简单的记录器。

我有一个带有以下原型的函数:

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;

任何帮助?

该类正在通过参数传递消息和格式+变量,只是尝试稍微改进一下

2 个答案:

答案 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左值引用,因此没有问题。