C++ 用一个参数重载一个 friend class 函数参数

C++ overloading a friend class function parameter with an argument

我不确定术语重载是否适用于此,但我想做的是继承一个 class 然后调用它的不带任何参数的成员函数,以便自动继承该参数来自当前 class 成员变量。用代码更容易解​​释,所以我将 post 放在这里:

#include <iostream>

template <typename T>
struct Singleton {
    static T & Instance() {
        static T instance;
        return instance;
    }

    T * operator -> () const {
        return &Instance();
    }
};

struct SFoo : Singleton<SFoo> {
    void Print( int a = 0 ) {
        printf( "%d\n", a );
    }
};

struct SBar : SFoo {
    const static int b = 42;
    friend void Print( int a = b); // <- Should call SFoo::Print() with integer b as the argument
};

int main() {
    using Foo = Singleton<SFoo>;
    using Bar = Singleton<SBar>;

    Foo()->Print( 123 ); // Should print: 123
    Bar()->Print();      // Should print: 42

    getchar();
    return 0;
}

我对继承比较陌生,似乎无法理解这么简单的一段代码。现在在打印 1230SFoo::Print() 的默认参数)时产生结果,这不是预期的。

void Print(int a = b) { SFoo::Print(a); }

让它发挥作用,正如您所指出的,它也可以是:

void Print() { SFoo::Print(b); }

因为我们不需要两个接受 int.

的版本

另一方面,您声明了一个 friend(这是一个非成员函数)。它没有在程序中的任何地方调用(Bar()->Print(); 调用 SFoo::Print),并且您没有因为缺少定义而收到链接器错误。