Re[3]: почему ругается компилятор? MSVC 2010
От: rg45 СССР  
Дата: 30.06.25 15:39
Оценка: +2
Здравствуйте, Marty, Вы писали:

R>>
R>>using Parent::print.
R>>



M>Не факт, что в Visual C++ 2010 есть такой using.


Есть. Это факт. Он был уже в Visual Studio 2003 (msvс-7.1).
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 30.06.2025 16:46 rg45 . Предыдущая версия . Еще …
Отредактировано 30.06.2025 15:40 rg45 . Предыдущая версия .
Отредактировано 30.06.2025 15:40 rg45 . Предыдущая версия .
Re[9]: почему ругается компилятор? MSVC 2010
От: rg45 СССР  
Дата: 03.07.25 07:39
Оценка: +1 :)
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Так я ж начал использовать C++ года с 93-го, с Turbo C++ 2.0,


А Borland C++? Пропустил?

ЕМ>потом — MS VC++ 4.0.


Ну а в msvc-4.0 это уже было, скорее всего. Я почти уверен в этом.

Ну и что, с 93-го года у тебя ни разу не возникло предположения, что в языке могло что-то измениться? Почему в 2025-м ты пишешь посты, как-будто до сих пор находишься в 1993-м?
--
Справедливость выше закона. А человечность выше справедливости.
Re[5]: почему ругается компилятор? MSVC 2010
От: rg45 СССР  
Дата: 03.07.25 06:21
Оценка: 12 (1)
Здравствуйте, Евгений Музыченко, Вы писали:

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


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

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


Где здесь вообще какие-нибудь "переходники"?
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 03.07.2025 6:30 rg45 . Предыдущая версия .
Re: почему ругается компилятор? MSVC 2010
От: Великий Мессия google
Дата: 30.06.25 15:33
Оценка: +1
а что из сообщений компилятора вам не понятно?

<source>:24:11: error: 'print' is a private member of 'Child'
24 | child.print(10);
| ^
<source>:15:18: note: implicitly declared private here
15 | virtual void print(int x, int y)
| ^
<source>:24:11: error: too few arguments to function call, expected 2, have 1; did you mean 'Parent::print'?
24 | child.print(10);
| ^~~~~
| Parent::print
<source>:6:18: note: 'Parent::print' declared here
6 | virtual void print(int x)
| ^
2 errors generated.
Compiler returned: 1

Re[7]: почему ругается компилятор? MSVC 2010
От: rg45 СССР  
Дата: 03.07.25 06:01
Оценка: :)
Здравствуйте, Евгений Музыченко, Вы писали:

R>>ты написал уже письмо Деду Морозу?


ЕМ>А толку?


А от твоего нытья какой толк?
--
Справедливость выше закона. А человечность выше справедливости.
Re[7]: почему ругается компилятор? MSVC 2010
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 03.07.25 08:45
Оценка: :)
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Когда-то давно мне впервые понадобилось в потомке расширить набор перегруженных функций предка, и тогда это можно было сделать только через определение одноименных переходников. Возможно, тогда еще не было using. Когда он появился, его применение акцентировалось главным образом на членах с той же сигнатурой — возможно, поэтому я и упустил возможность его использования для перегрузок.


Ерунда какая-то, зачем делать using для членов с той же сигнатурой, если ты эту сигнатуру как раз перегружаешь. Более того, в using никакой сигнатуры нет, using на все перегрузки имени работает
Маньяк Робокряк колесит по городу
Re[9]: почему ругается компилятор? MSVC 2010
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 03.07.25 08:51
Оценка: :)
Здравствуйте, Евгений Музыченко, Вы писали:

M>>зачем делать using для членов с той же сигнатурой, если ты эту сигнатуру как раз перегружаешь.


ЕМ>Как раз эту сигнатуру я не перегружаю. Моя задача несколько отличалась от той, что описал ТС.


Тогда вообще ничего не понятно
Маньяк Робокряк колесит по городу
Re[11]: почему ругается компилятор? MSVC 2010
От: rg45 СССР  
Дата: 03.07.25 10:20
Оценка: +1
Здравствуйте, Евгений Музыченко, Вы писали:

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


Ага. "Не слежу, но осуждаю". Так получается.
--
Справедливость выше закона. А человечность выше справедливости.
Re[10]: почему ругается компилятор? MSVC 2010
От: bnk СССР http://unmanagedvisio.com/
Дата: 05.07.25 21:49
Оценка: +1
Здравствуйте, rg45, Вы писали:

ЕМ>>Так я ж начал использовать C++ года с 93-го, с Turbo C++ 2.0,


R>А Borland C++? Пропустил?


Вот кстати да, очень странно видеть отсутствие в этом наборе Borland C++ 3.1
почему ругается компилятор? MSVC 2010
От: sushko Россия  
Дата: 30.06.25 15:16
Оценка:
Visual C++ 2010. Компилятор ругается на вызов child.print(10) в _tmain: ему не хватает аргументов.

Скажите, что я делаю не так?

#include "stdafx.h"

class Parent
{
public:
    virtual void print(int x)
    {
        printf("%d", x);
    };
};

class Child: public Parent
{
    virtual void print(int x, int y)
    {
        printf("%d %d", x, y);
    };
};

int _tmain(int argc, _TCHAR* argv[])
{
    Child child;
    child.print(10);
    return 0;
}
Бесплатный генератор отчетов для программ на C/C++
http://www.oxetta.com
Re: почему ругается компилятор? MSVC 2010
От: rg45 СССР  
Дата: 30.06.25 15:33
Оценка:
Здравствуйте, sushko, Вы писали:

S>Visual C++ 2010. Компилятор ругается на вызов child.print(10) в _tmain: ему не хватает аргументов.


S>Скажите, что я делаю не так?


S>
S>#include "stdafx.h"

S>class Parent
S>{
S>public:
S>    virtual void print(int x)
S>    {
S>        printf("%d", x);
S>    };
S>};

S>class Child: public Parent
S>{
S>    virtual void print(int x, int y)
S>    {
S>        printf("%d %d", x, y);
S>    };
S>};

S>int _tmain(int argc, _TCHAR* argv[])
S>{
S>    Child child;
S>    child.print(10);
S>    return 0;
S>}

S>


Child::print не оверрайдит (override), а скрывает (hide) Parent::print.

Добавь в Child using декларацию:

public:
    using Parent::print;
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 30.06.2025 16:03 rg45 . Предыдущая версия . Еще …
Отредактировано 30.06.2025 16:02 rg45 . Предыдущая версия .
Отредактировано 30.06.2025 15:34 rg45 . Предыдущая версия .
Re[2]: почему ругается компилятор? MSVC 2010
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 30.06.25 15:38
Оценка:
Здравствуйте, rg45, Вы писали:


R>Добавь в Child using декларацию:


R>
R>using Parent::print.
R>



Не факт, что в Visual C++ 2010 есть такой using. Я в Visual C++ 2005 обходился вставкой прототипов всех версий print. Хотя, может, using и тогда уже так умел, а я просто не знал.
Маньяк Робокряк колесит по городу
Re[2]: почему ругается компилятор? MSVC 2010
От: sushko Россия  
Дата: 30.06.25 16:12
Оценка:
Здравствуйте, rg45, Вы писали:

R>Добавь в Child using декларацию:


Заработало. Спасибо!

R>Child::print не оверрайдит (override), а скрывает (hide) Parent::print.


Странно мне это. Мне казалось, что по логике родительский print должен был "становиться рядом" с дочерним. Поскольку набор аргументов разный, то дескрипторы (если я правильно понимаю этот термин) функций не должны пересекаться...

Спасибо еще раз!
Бесплатный генератор отчетов для программ на C/C++
http://www.oxetta.com
Re[3]: почему ругается компилятор? MSVC 2010
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 30.06.25 16:16
Оценка:
Здравствуйте, sushko, Вы писали:

S>Странно мне это. Мне казалось, что по логике родительский print должен был "становиться рядом" с дочерним. Поскольку набор аргументов разный, то дескрипторы (если я правильно понимаю этот термин) функций не должны пересекаться...


Нет, имя print перекрывает все перегрузки из базового класса
Маньяк Робокряк колесит по городу
Re[3]: почему ругается компилятор? MSVC 2010
От: rg45 СССР  
Дата: 30.06.25 16:16
Оценка:
Здравствуйте, sushko, Вы писали:

S>Странно мне это. Мне казалось, что по логике родительский print должен был "становиться рядом" с дочерним. Поскольку набор аргументов разный, то дескрипторы (если я правильно понимаю этот термин) функций не должны пересекаться...


Так происходит, когда перегруженные функции находятся в одном классе. А одноименные функции производных классов скрывают функции базового класса. Так было, начиная с C++98. И даже раньше. И логика тут простая — производный класс может объявить повторно любой из членов базового класса, в т.ч. и функцию-член — с идентичными параметрами и модификаторами. И это не будет вызывать ошибок компиляции.

Собственно, с пространствами имен ведь ровно то же самое.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 30.06.2025 16:51 rg45 . Предыдущая версия . Еще …
Отредактировано 30.06.2025 16:20 rg45 . Предыдущая версия .
Re[4]: почему ругается компилятор? MSVC 2010
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.07.25 05:43
Оценка:
Здравствуйте, rg45, Вы писали:

R>одноименные функции производных классов скрывают функции базового класса.


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

Вполне ж банальная ситуация, когда базовый класс определяет несколько одноименных функций с разными наборами параметров, а дочерний класс хочет расширить этот набор аналогичными своими.
Re[5]: почему ругается компилятор? MSVC 2010
От: rg45 СССР  
Дата: 03.07.25 05:53
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

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


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


Ну ты написал уже письмо Деду Морозу?
--
Справедливость выше закона. А человечность выше справедливости.
Re[6]: почему ругается компилятор? MSVC 2010
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.07.25 06:01
Оценка:
Здравствуйте, rg45, Вы писали:

R>ты написал уже письмо Деду Морозу?


А толку?
Re[6]: почему ругается компилятор? MSVC 2010
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.07.25 07:04
Оценка:
Здравствуйте, rg45, Вы писали:

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


Когда-то давно мне впервые понадобилось в потомке расширить набор перегруженных функций предка, и тогда это можно было сделать только через определение одноименных переходников. Возможно, тогда еще не было using. Когда он появился, его применение акцентировалось главным образом на членах с той же сигнатурой — возможно, поэтому я и упустил возможность его использования для перегрузок.

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


Теперь вижу, что для такой задачи тоже годится, спасибо!
Re[7]: почему ругается компилятор? MSVC 2010
От: rg45 СССР  
Дата: 03.07.25 07:07
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Когда-то давно мне впервые понадобилось в потомке расширить набор перегруженных функций предка, и тогда это можно было сделать только через определение одноименных переходников. Возможно, тогда еще не было using. Когда он появился, его применение акцентировалось главным образом на членах с той же сигнатурой — возможно, поэтому я и упустил возможность его использования для перегрузок.


Когда не было using? В 2003 студии он был уже точно (в том виде, который в примере). Вот был ли он раньше — на счёт этого я не уверен.
--
Справедливость выше закона. А человечность выше справедливости.
Re[7]: почему ругается компилятор? MSVC 2010
От: rg45 СССР  
Дата: 03.07.25 07:18
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Когда-то давно мне впервые понадобилось в потомке расширить набор перегруженных функций предка, и тогда это можно было сделать только через определение одноименных переходников. Возможно, тогда еще не было using. Когда он появился, его применение акцентировалось главным образом на членах с той же сигнатурой — возможно, поэтому я и упустил возможность его использования для перегрузок.


Я заглянул в стандарт 98-го года и вижу, что пункт "7.3.3 The using declaration" там есть, практически в том же виде, что и в стандарте C++03. Сам я этого не помню уже, но уверен на 99%, что в компиляторах msvc using директивы и using объявления присутствовали изначально. Так что, все беды от незнания, как ни крути.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 03.07.2025 7:18 rg45 . Предыдущая версия .
Re[8]: почему ругается компилятор? MSVC 2010
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.07.25 07:35
Оценка:
Здравствуйте, rg45, Вы писали:

R>Когда не было using? В 2003 студии он был уже точно


Так я ж начал использовать C++ года с 93-го, с Turbo C++ 2.0, потом — MS VC++ 4.0.
Re[10]: почему ругается компилятор? MSVC 2010
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.07.25 08:36
Оценка:
Здравствуйте, rg45, Вы писали:

R>А Borland C++? Пропустил?


Ага. TC++ 2.0 мне категорически не понравился, а дальше был уже нужен компилятор под винду. 32-разрядный VC++ был неплох, а BC++ еще какое-то время сохранял рудименты 16-разрядного кода.

R>с 93-го года у тебя ни разу не возникло предположения, что в языке могло что-то измениться? Почему в 2025-м ты пишешь посты, как-будто до сих пор находишься в 1993-м?


Да все мы периодически открываем для себя то, что другим уже давно очевидно. Не хватает ресурсов мозга следить за всем. Я ж не фанат C++, как Вы, не жду с нетерпением очередного стандарта, не собеседую новичков на знание тонкостей и т.п.
Re[8]: почему ругается компилятор? MSVC 2010
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.07.25 08:47
Оценка:
Здравствуйте, Marty, Вы писали:

M>зачем делать using для членов с той же сигнатурой, если ты эту сигнатуру как раз перегружаешь.


Как раз эту сигнатуру я не перегружаю. Моя задача несколько отличалась от той, что описал ТС.
Re[12]: почему ругается компилятор? MSVC 2010
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.07.25 10:30
Оценка:
Здравствуйте, rg45, Вы писали:

R>"Не слежу, но осуждаю". Так получается.


Ну, когда в языке десятки лет сохраняется ряд очевидных косяков, осуждать которые уже привычно, неизбежно случается осуждать и уже устраненные.
Re[8]: почему ругается компилятор? MSVC 2010
От: wander  
Дата: 05.07.25 19:48
Оценка:
Здравствуйте, rg45, Вы писали:

R>Я заглянул в стандарт 98-го года и вижу, что пункт "7.3.3 The using declaration" там есть, практически в том же виде, что и в стандарте C++03. Сам я этого не помню уже, но уверен на 99%, что в компиляторах msvc using директивы и using объявления присутствовали изначально. Так что, все беды от незнания, как ни крути.


Вспоминаю, что в GCC 2.95 была некая проблема с using при использовании в классах, хотя он уже поддерживал с++98.
Возможно подобные проблемы были и у других компиляторов того времени.
Re[5]: почему ругается компилятор? MSVC 2010
От: Кодт Россия  
Дата: 18.07.25 20:16
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

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


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


Тогда нужен будет механизм принудительного сокрытия — если кому-то понадобится именно такое поведение.
void Parent::print(int) = delete;

так, что ли?
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.