C++ перегружает параметр функции другого класса аргументом

Я не уверен, применяется ли здесь термин "перегрузка", но я хотел бы унаследовать класс, а затем вызвать его функцию-член без каких-либо параметров, чтобы этот параметр автоматически наследовался из текущей переменной-члена класса. Это проще объяснить в коде, поэтому я опубликую его здесь:

#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;
}

Я относительно новичок в наследовании и не могу понять такой простой кусок кода. Результат прямо сейчас дает в печати 123 а также 0 (аргумент по умолчанию SFoo::Print()), чего не ожидается.

1 ответ

Решение
void Print(int a = b) { SFoo::Print(a); }

заставляет это работать, как вы указали, это также может быть:

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

потому что нам не нужны две версии, которые принимают int,

С другой стороны, вы объявляли friend (которая не является функцией-членом). Это не было вызвано нигде в программе (Bar()->Print(); звонки SFoo::Print), и вы не получили ошибку компоновщика из-за отсутствующего определения.

Другие вопросы по тегам