C++ C++;:超载<&书信电报;带函数指针的运算符
我有一个类“stampstream”,基本上是为了像“cout”一样工作。接下来的两个函数在类之外。这是有效的部分C++ C++;:超载<&书信电报;带函数指针的运算符,c++,operator-overloading,C++,Operator Overloading,我有一个类“stampstream”,基本上是为了像“cout”一样工作。接下来的两个函数在类之外。这是有效的部分 class stampstream: public std::ostream { //code stampstream& operator<<(stampstream& (*x)(void)) { //code } //code }; stampstream& endr() { /
class stampstream: public std::ostream
{
//code
stampstream& operator<<(stampstream& (*x)(void))
{
//code
}
//code
};
stampstream& endr()
{
//nocode
}
stampstream& (*endrow)(void)=endr;
row有什么问题吗?问题在于
s << "teststring2" << row(5);
这不会调用函数,而是将指针传递给操作符问题在于
s << "teststring2" << row(5);
这不会调用函数,而是将指针传递到操作符,因为Chris已经回答了您的问题,我想建议您使用当前方法的替代方法:
您的stampstream
类应该使用一个专门的std::streambuf
来写出overflow()中的戳记。无需扩展std::ostream
并重新实现输入运算符。有关如何执行此操作的示例
您似乎像操纵器一样使用endrow
和row
。对于在调用站点不接受参数的操纵器,已存在运算符重载。您可以让endrow
获取并返回类型为std::ostream&
的对象。对于行
可以让它返回一个重载插入器的类,以允许使用所需的语法:
struct row\u impl
{
行impl(int行):行(row){
//写出行并返回流
friend std::ostream&operator既然Chris已经回答了您的问题,我想建议您使用当前方法的替代方案:
您的stampstream
类应该使用一个专门的std::streambuf
,它在overflow()
内写出戳记。无需扩展std::ostream
并重新实现输入运算符。有关如何执行此操作的示例
您似乎像操纵器一样使用endrow
和row
。对于在调用站点不接受参数的操纵器,运算符重载已经存在。您可以让endrow
接受并返回类型为std::ostream&
的对象。对于row
的操纵器,可以让它返回一个重载允许使用所需语法的插入器:
struct row\u impl
{
行impl(int行):行(row){
//写出行并返回流
friend std::ostream&Operator提示:行(5)
的类型是什么?行是带有int参数的stampstream类型,当您调用它时,就像您说行(5)时一样
,它返回什么?一个stampstream
,不是指向函数的指针。它不返回任何东西,但endrow也不返回任何东西,这很好。是的,它应该是一个stampstream类型的返回。它是“函数调用操作符”。它出现在函数或函数指针的右侧,立即调用它,并计算函数调用的结果(返回)。如果需要s提示:行(5)
的类型是什么?行是带有int参数的stampstream类型,当您调用它时,就像您说行(5)时一样
,它返回什么?一个stampstream
,不是指向函数的指针。它不返回任何东西,但endrow也不返回任何东西,这很好。是的,它应该是一个stampstream类型的返回。它是“函数调用操作符”。它出现在函数或函数指针的右侧,立即调用它,并计算结果(返回)如果你想s,我得到了一堆错误,但主要是这让我回到:错误:“行”没有在这个范围内声明…因为我假设它没有stampstream类型。“一堆错误”可能表明你的编译器不支持C++11我正在使用g++编译器。我尝试了g++-std=C++11…这就是为什么我得到:错误:声明'operator@Prasad您还需要#包括。谢谢!它可以编译..现在我想知道返回[x]()->stampstream&{…我试图做的是需要一个私有类成员数据。另外,我如何使用在重载下传递到类内第5行的参数5我得到了一系列错误,但主要是这让我回到:错误:'行'没有在这个范围内声明…因为我假设它没有stampstream类型。'一系列错误'可能表示您的编译器不支持C++11我正在使用g++编译器。我尝试了g++-std=C++11…这是我得到的结果:错误:声明'operator@Prasad您还需要#包括。谢谢!它可以编译..现在我想知道返回[x]()->stampstream&{…我要做的是需要一个私有类成员数据。另外,我如何使用在类中的重载下传递到第5行的参数5,该重载是建议的原始解决方案..我想交替尝试。但是谢谢:)这是建议的原始解决方案..我想交替尝试。但是谢谢:)
s << "teststring2" << row(5);
error: invalid user-defined conversion from ‘stampstream’ to ‘stampstream& (*)(int)’ [-fpermissive]
s << "teststring2" << row(5);
s << "teststring2" << row;
class stampstream: public std::ostream
{
//code
stampstream& operator<<(std::function<stampstream&(void)> r)
{
//code
}
//code
};
std::function<stampstream&(void)> row(int x)
{
return [x]()->stampstream & {
//code
}
}
s << "teststring2" << row(5);