【问题标题】:ostringstream overloading const char * with the void *ostringstream 用 void * 重载 const char *
【发布时间】:2012-05-24 14:44:47
【问题描述】:

我的 ostream 有问题,我写了一个非常基本的宏,应该打印出它的参数。

请看下面的示例代码:

#define LOG Message(__FILE__, __LINE__,__func__)

class Message : public std::ostringstream 
{
    public:
        Message(const char *param1, int param2, const char *param3)
        {
            *this<<param3<<"("<<param1<<":"<<param2<<")";
        }
        ~Message()
        {
            *this<<endl;
            cout<< rdbuf()->str();
        }
};


int main()
{
    int integer = 1;
    string str = "XYZ";

    LOG<<integer<<"DEBUGLOG1: "<<str<<" "<<integer;
    return 0;
}

问题是如果我使用:

LOG << "LOG1: " << str << " " << integer;

输出打印 const char* "LOG1:" 的地址*,而不是值。

但是, 如果我使用:

LOG << integer << "DEBUGLOG1: " << str << " " << integer;

输出完美,打印整数值和字符值。

看起来不像使用ostream&amp; operator&lt;&lt; (ostream&amp; out, const char* s );

它正在使用ostream&amp; operator&lt;&lt; (const void* val);

任何人都可以解释一下可以做些什么来克服这种超载吗?

提前致谢

【问题讨论】:

  • 你为什么不直接使用#define LOG (std::cout &lt;&lt; __FILE__ &lt;&lt; __LINE__ &lt;&lt; __func__)
  • 谢谢,由于性能影响,这会标记我不能

标签: c++


【解决方案1】:

问题是Message(...) 是临时的。临时不能绑定到operator&lt;&lt; 的非常量引用参数。

它只能与成员函数和运算符一起使用,例如ostream::operator&lt;&lt;(int)

奇怪的是,成员运算符返回一个引用,而该引用又可以与非成员运算符一起使用。

【讨论】:

  • 一种可能的解决方案是利用您所谓的“奇怪的东西”。如果我们将宏替换为:#define LOG Message(__FILE__, __LINE__,__func__).flush(),那就更好了。
  • 但是我们知道此时流是空的,所以(至少在语义上)没有缺点。
  • @Robᵩ:不,此时流不是为空的,因为构造函数(刚刚完成)已经向流中写入了一些内容。
  • @Rob - 对,并且(考虑一下)对于字符串流flush 无论如何都不会做任何事情。
  • @CharlesBailey - 你当然是对的。感谢您纠正我。
【解决方案2】:

预编译并查看宏被分解为什么。使用宏很困难(而且不可取......),这是一种非常重要的调试方法,您需要了解以避免继续使用 Google 或 SO。

我相信你想要g++ -E

【讨论】:

  • 正如 Bo 所指出的,这是一个非常微妙的问题,我相信很多人可能会错过......简单地扩展宏(至少对于这样一个简单的宏)不会'不能完全解决这个问题。
  • 预处理后可以研究正确的问题,而不是无法将问题隔离到 C++ 类魔法而不是 C 宏魔法。也许这不会给出完整的答案,但这是第一步。
  • 这是一个非常简单的宏......我认为它正在扩展的内容很明显。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 2013-06-04
相关资源
最近更新 更多