当我尝试自己的版本时,我正在
错误C2039:'endl':不是'abc'的成员 错误C2065:'endl':未声明的标识符
以下是代码。
#include <iostream>
#include <stdio.h>
//assume this class uses some proprietary logging system. I just use the wrap the C
//output functions here but assume is a corporate log system
namespace abc {
class log_stream
{
public:
log_stream(const char* filename) {
fp_ = fopen(filename, "w");
}
log_stream& operator<<(short val) { if (fp_) { output_int(val); } return *this; }
log_stream& operator<<(unsigned short val) { if (fp_) { output_int(val); } return *this; }
log_stream& operator<<(int val) { if (fp_) { output_int(val); } return *this; }
log_stream& operator<<(unsigned int val) { if (fp_) { output_int(val); } return *this; }
log_stream& operator<<(long val) { if (fp_) { output_int(val); } return *this; }
log_stream& operator<<(unsigned long val) { if (fp_) { output_int(val); } return *this; }
log_stream& operator<<(const char* val) { if (fp_) { output_string(val); } return *this; }
inline log_stream& endl(log_stream& os) { return os.endl(); }
//etc
log_stream& endl() {
if(fp_)
fputc('\n', fp_);
return *this;
}
private:
void output_int(long v) { fprintf(fp_, "%d", v); }
void output_string(const char* s) { fprintf(fp_, "%s", s); }
FILE* fp_;
};
} //namespace abc
int main() {
abc::log_stream logger("myfile.txt");
//error C2039: 'endl' : is not a member of 'abc', error C2065: 'endl' : undeclared identifier
logger << "number " << 3 << abc::endl;
return 0;
}
更新:
如果我添加
inline log_stream& endl(log_stream& os) { return os.endl(); }
在abc命名空间内(但在课外,我得到
error C2678: binary '<<' : no operator found which takes a left-hand operand of type 'abc::log_stream' (or there is no acceptable conversion)
哪个更接近(我认为)解决,但还没有。
UPDATE2。
嗯,那真是毛茸茸的!以下是我为任何做类似事情的人解决问题的方法。谢谢Julien。将这些添加到课程中:
~log_stream() { if(fp_) fclose(fp_); }
// this is the main one I was missing
abc::log_stream& abc::log_stream::operator<<( log_stream& (*pf)(log_stream&) )
{
return pf(*this);
}
然后在课外:
ABC :: log_stream&安培; endl(abc :: log_stream&amp; log) { log.endl(); 返回日志; }
答案 0 :(得分:1)
std::endl
是一个以std::ostream
作为单个参数的函数,而ostream<<
是一个采用std::endl
类型的重载。
要为log_stream
复制此行为,请为其覆盖std::endl
:
abc::log_stream& std::endl( abc::log_stream& log )
{
log.endl();
return log;
}
并覆盖abc::log_stream::operator<<
以使用它:
abc::log_stream& abc::log_stream::operator<<( log_stream& (*pf)(log_stream&) )
{
return pf(*this);
}
如您所见,abc::log_stream::operator<<
的参数采用std::endl
的类型作为参数。
另请注意std::endl
flushes the stream。因此,您应该考虑在fflush(fp_)
中调用abc::log::endl()
。
答案 1 :(得分:0)
我认为你应该制作一个operator<<
类型的endl
。或者让它std::endl
。另请参阅类似问题的答案:https://stackoverflow.com/a/1134467/4323 - 基本上,endl
是一个类似于你的函数,但你需要为你的类创建一个插入运算符,它接受该函数作为它的右手参数,并调用它。