Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / C++ |
![]() ![]() |
Dimitry Sibiryakov Member Откуда: Сообщений: 52921 |
Когда мы пишем, напримерstruct MyClass: public std::basic_string<unsigned char> {} то теряем возможность обращаться к методам базового класса. То есть следующее даже не скомпилируется: MyClass foo; foo.append("abc", 3); И даже это не скомпилируется: MyClass foo; foo.append(reinterpret_cast<const unsigned char*>("abc"), 3); Чтобы оно таки скомпилировалось, нам придётся добавить в объявление MyClass public: using std::basic_string<unsigned_char>::append; Собственно вопрос: можно ли в этом месте как-то обойтись без полного припева "std::basic_string<unsigned_char>"? Сообщение было отредактировано: 10 фев 21, 19:23 |
10 фев 21, 19:27 [22279085] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Я делаю так в подобных случаях: using Base = std::basic_string<unsigned_char>; public: using Base::append; Вы уверены, что ваши примеры не компилируются? Потому что у меня компилируются. После приведения типа строки, конечно. |
||||
10 фев 21, 19:43 [22279097] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52921 |
Уверен.
Возможно, тут роляет что у меня в классе ещё одна перегрузка append добавлена и это выбивает унаследованные за пределы видимости. Posted via ActualForum NNTP Server 1.5 |
||||
10 фев 21, 19:51 [22279103] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Почему вы решили, что после наследования нельзя вызывать методы базового класса? В вашем коде другая проблема. Метод append(), по идее, должен вернуть MyClass&, а вернёт std::basic_string&. |
10 фев 21, 19:52 [22279104] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
А ну это само собой. Метод append() в наследнике экранирует все перегрузки append() в базовом классе. Так всегда было. Могу предложить:
using Base::append;
|
||||
10 фев 21, 19:54 [22279108] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52921 |
Да, походу придётся удовлетвориться typedef std::basic_string<unsigned char> ustring; class foo: public ustring { using ustring::append; }; и надеяться, что комитет по извращениям когда-нибудь введёт class foo: public std::basic_string<unsigned char> alias ustring Posted via ActualForum NNTP Server 1.5 |
10 фев 21, 20:03 [22279117] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
И тем не менее append() у вас возвращает не то что нужно. По сути вы поломали логику класса. |
10 фев 21, 20:29 [22279138] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52921 |
Наплевать, это мой класс и как я его использую - моё дело. Posted via ActualForum NNTP Server 1.5 |
10 фев 21, 23:07 [22279198] Ответить | Цитировать Сообщить модератору |
a guest Member Откуда: Сообщений: 326 |
|
|||||
10 фев 21, 23:49 [22279209] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Классно. А почему оно не компилируется? class Foo {}; class Bar: Base = public Foo {}; |
||||
11 фев 21, 00:18 [22279219] Ответить | Цитировать Сообщить модератору |
a guest Member Откуда: Сообщений: 326 |
petrav, дальше голосования на EWG, видимо, не пошло. |
11 фев 21, 00:50 [22279224] Ответить | Цитировать Сообщить модератору |
Все форумы / C++ | ![]() |