Информация об изменениях

Сообщение Re[5]: почему ругается компилятор? MSVC 2010 от 03.07.2025 6:21

Изменено 03.07.2025 6:30 rg45

Re[5]: почему ругается компилятор? MSVC 2010
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Я бы предпочел, чтобы это правило было менее радикальным, и одноименную функцию дочернего класса с другой сигнатурой можно было бы просто добавить к наследуемым функциям базового, не выписывая тупых переходников для базовой функции и всех ее перегрузок.


Расскажи, где ты здесь перетрудился, "выписывая тупые переходники для базовой функции и всех ее перегрузок"?

https://coliru.stacked-crooked.com/a/b9ed915d35432d10

#include <iostream>
#include <source_location>

std::string current_function(std::source_location location = std::source_location::current()) {
    return location.function_name();
}

struct Base
{
    void foo() const { std::cout << current_function() << std::endl; }
    void foo(int) const { std::cout << current_function() << std::endl; }
    void foo(int, int) const { std::cout << current_function() << std::endl; }
    void foo(int, int, int) const { std::cout << current_function() << std::endl; }
};

struct Derived : Base
{
    using Base::foo;
    void foo(int) const { std::cout << current_function() << std::endl; }
};

int main() {
    Derived d;

    d.foo();
    d.foo(1); // void Derived::foo(int) const
    d.foo(1, 2);
    d.foo(1, 2, 3);
}
Re[5]: почему ругается компилятор? MSVC 2010
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Я бы предпочел, чтобы это правило было менее радикальным, и одноименную функцию дочернего класса с другой сигнатурой можно было бы просто добавить к наследуемым функциям базового, не выписывая тупых переходников для базовой функции и всех ее перегрузок.


Расскажи, где ты здесь перетрудился, "выписывая тупые переходники для базовой функции и всех ее перегрузок"?

https://coliru.stacked-crooked.com/a/b9ed915d35432d10

#include <iostream>
#include <source_location>

std::string current_function(std::source_location location = std::source_location::current()) {
    return location.function_name();
}

struct Base
{
    void foo() const { std::cout << current_function() << std::endl; }
    void foo(int) const { std::cout << current_function() << std::endl; }
    void foo(int, int) const { std::cout << current_function() << std::endl; }
    void foo(int, int, int) const { std::cout << current_function() << std::endl; }
};

struct Derived : Base
{
    using Base::foo;
    void foo(int) const { std::cout << current_function() << std::endl; }
};

int main() {
    Derived d;

    d.foo();
    d.foo(1); // void Derived::foo(int) const
    d.foo(1, 2);
    d.foo(1, 2, 3);
}


Где здесь вообще какие-нибудь "переходники"?