C++ C++;:超载<&书信电报;带函数指针的运算符

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() { /

我有一个类“stampstream”,基本上是为了像“cout”一样工作。接下来的两个函数在类之外。这是有效的部分

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);