我遇到了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:”的Address *而不是值。
但是, 如果我使用:
LOG << integer << "DEBUGLOG1: " << str << " " << integer;
输出完美,打印整数值和char值。
看起来不是使用ostream& operator<< (ostream& out, const char* s );
它正在使用ostream& operator<< (const void* val);
?
任何人都可以了解如何克服这种超载吗?
提前致谢
答案 0 :(得分:5)
问题是Message(...)
是暂时的。临时无法绑定到operator<<
的非const引用参数。
它只能与成员函数和运算符一起使用,例如ostream::operator<<(int)
。
奇怪的是成员运算符返回一个引用,而该引用又可以与非成员运算符一起使用。
答案 1 :(得分:-1)
预编译并查看宏被解开的内容。使用宏很困难(并且不可取......),这是一个非常基本的调试方法,您需要知道以避免继续使用Google或SO。
我相信你想要g++ -E
。