powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Предобъявление typedef-а
28 сообщений из 28, показаны все 2 страниц
Предобъявление typedef-а
    #39980561
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Было так:

Код: plaintext
1.
class Foo;


Но потом Foo перестал быть классом:

Код: plaintext
1.
using Foo = Bar<int>;


И предобъявление перестало работать. Пришлось написать #include там где оно не нужно.

Можно это как-то обойти?
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39980566
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно, конечно, сделать так:

Код: plaintext
1.
class Foo: public Bar<int> {};


Но это как-то не особо что ли… Конструкторы, наверное нужно будет написать.
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39980572
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

>Но потом Foo перестал быть классом:
Разные типы с одним именем? Зачем?
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39980573
L.Otujktd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrav
Было так:

Код: plaintext
1.
class Foo;


Но потом Foo перестал быть классом:

Код: plaintext
1.
using Foo = Bar<int>;


И предобъявление перестало работать. Пришлось написать #include там где оно не нужно.

Можно это как-то обойти?

У Вас используется явная специализация для шаблонного класса Bar, поэтому необходимо подключить файл с реализацией Bar. Раньше я так понимаю был forward declaration, но в таком виде оно сработает без подключения заголовочника для Bar только если использовать описание методов со ссылками/указателями на Bar, иначе будет ошибка компиляции
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39980578
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravМожно это как-то обойти?

То место, где использовалось Foo, перековать на темплейт с Foo в качестве параметра.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39980609
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravМожно это как-то обойти?

То место, где использовалось Foo, перековать на темплейт с Foo в качестве параметра.

Неожиданное решение, но неподходящее. :)
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39980849
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://stackoverflow.com/questions/20108568/c-forward-declare-using-directive
Код: plaintext
1.
2.
template<typemane T> class Bar;
using Foo = Bar<int>;
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39980862
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone
https://stackoverflow.com/questions/20108568/c-forward-declare-using-directive
Код: plaintext
1.
2.
template<typemane T> class Bar;
using Foo = Bar<int>;


Хоть один пояснил для новичка.
Остальные снобы какие то)
Я гуглл, гуглил но так и не понял сперва что тут шаблонами пахнет)
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39980874
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC SharpХоть один пояснил для новичка.

Так petrav вроде преподаватель, а не новичок.

Код: sql
1.
2.
3.
4.
5.
template <typename Foo>
class megatype
......

megatype < Bar<int> > megavar;


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39980894
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Я новичок в плюсах)))
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39980905
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так топик-то не твой. )))
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39980937
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Так топик-то не твой. )))

И не твой.
Прошлый топик ты тоже пытался быть воспитателем)
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39980946
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну кому-то же надо этим заниматься после того как облажались родители и школа.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39980951
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
Я сказал что Barlone ответил лучше. Ничего личного.
Закругляйся.
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39980955
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

PetroNotC SharpХоть один пояснил для новичка.

Так petrav вроде преподаватель, а не новичок.

Код: sql
1.
2.
3.
4.
5.
template <typename Foo>
class megatype
......

megatype < Bar<int> > megavar;



И весь функционал из .cpp перенести в .h? Хотели уменьшить количество зависимостей, но наоборот, кардинально увеличили это количество. Очень умно, вообще отлично, медаль за находчивость.
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39980967
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravИ весь функционал из .cpp перенести в .h?

Во-первых, это вовсе не обязательно.
Во-вторых, именно для этого и существую предкомпилированные заголовки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39981013
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravИ весь функционал из .cpp перенести в .h?

Во-первых, это вовсе не обязательно.
Ну например.

Код: plaintext
1.
2.
3.
// Any.h
class Foo;
void doSomething(Foo&);


Далее Foo становится псевдонимом (typedef). doSomething() делаем шаблоном? Но как же нам не перенести тогда тело функции в заголовочник?

Да и вообще, делать что-то шаблоном (хотя шаблон там не нужен) только что бы убрать зависимость -- не кажется удачной идеей. Хотя я где-то делал так, но то был закрытый метод класса и его тело шаблонного метода, да, было в .cpp.
Dimitry Sibiryakov
Во-вторых, именно для этого и существую предкомпилированные заголовки.

Не тот случай, файл часто меняется.
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39981029
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно, конечно, попробовать явно инстанцировать этот шаблон. И тогда возможно его тело останется в .cpp.
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39981061
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravДа и вообще, делать что-то шаблоном (хотя шаблон там не нужен) только что бы убрать
зависимость -- не кажется удачной идеей.

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

Не всякую зависимость нужно убирать. Некоторые подобны ссылочной целостности в БД:
предотвращают глобальный катаклизм после локальных (казалось бы) изменений.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39981116
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravДа и вообще, делать что-то шаблоном (хотя шаблон там не нужен) только что бы убрать
зависимость -- не кажется удачной идеей.

Функция, которая что-то делает с инстансом неизвестного типа, тоже не выглядит здраво.
Намекает, что консерваторию неплохо бы переделать.
Это стандартный приём программирования на С++.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
// Bar.h.
class Foo;
class Bar
{
public:
    void doSomething();
private:
    void doAnything(Foo&);
};


Dimitry Sibiryakov
Не всякую зависимость нужно убирать. Некоторые подобны ссылочной целостности в БД:
предотвращают глобальный катаклизм после локальных (казалось бы) изменений.

А можно реалистичный пример?
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39981117
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone
https://stackoverflow.com/questions/20108568/c-forward-declare-using-directive
Код: plaintext
1.
2.
template<typemane T> class Bar;
using Foo = Bar<int>;


Да, спасибо! Странно, что я об этом не догадался. Ведь я же знал о такой возможности.
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39981129
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravЭто стандартный приём программирования на С++.

Forward declaration это обычный приём в любом ЯП. Но обычно он применялся с указателями и
реальное объявление типа должно было следовать перед первым реальным применением этого
указателя. Естественно, тип forward declaration тоже должен совпадать с реальным, потому
что на его основе компилятор решает какие механизмы использовать "унутре".

petravА можно реалистичный пример?

DLL компилируется с функцией у которой параметр - указатель на целое. Приложение
компилируется с "не совсем таким" заголовком и использует указатель на short. Формально
сигнатуры совпадают, никаких предупреждений или ошибок, а результат - SegFault.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39981326
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravЭто стандартный приём программирования на С++.

Forward declaration это обычный приём в любом ЯП.
В C# есть forward declaration class? Я погуглил — вроде бы нету.

Dimitry Sibiryakov
Но обычно он применялся с указателями и
реальное объявление типа должно было следовать перед первым реальным применением этого
указателя. Естественно, тип forward declaration тоже должен совпадать с реальным, потому
что на его основе компилятор решает какие механизмы использовать "унутре".

Спасибо, но это понятно и очевидно.

Dimitry Sibiryakov

petravА можно реалистичный пример?

DLL компилируется с функцией у которой параметр - указатель на целое. Приложение
компилируется с "не совсем таким" заголовком и использует указатель на short. Формально
сигнатуры совпадают, никаких предупреждений или ошибок, а результат - SegFault.

ИМХО, пример неудачный. Он к С++ вообще отношения не имеет. Это скорее ошибка производственного процесса.
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39981331
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravпример неудачный. Он к С++ вообще отношения не имеет.

Почему? Типичный случай проблемы когда объявление чего-то в одном месте отличается от
объявления в другом. Как раз для этого топика, где Foo в одном месте объявлено как class,
а в другом внезапно как что-то другое. И это счастье, что подобная фигня обнаруживается
уже при компиляции, а не вызывает падение уже готового приложения у пользователя.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39981385
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,
>В C# есть forward declaration class? Я погуглил — вроде бы нету.
= потому что неполный тип или работа с указателями это вчерашний день.
Во первых статическая типизация наше все. Я ее люблю.
Во вторых в дельфи есть предварительное объявление.
Используется для решения зацикленности ссылок.
Что решается у вас в данном топике, непонятно.
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39981393
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp

Что решается у вас в данном топике, непонятно.

Уменьшение количества зависимостей единиц компиляции от заголовочных файлов.

Забей, короче.
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39981534
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravпример неудачный. Он к С++ вообще отношения не имеет.

Почему? Типичный случай проблемы когда объявление чего-то в одном месте отличается от
объявления в другом. Как раз для этого топика, где Foo в одном месте объявлено как class,
а в другом внезапно как что-то другое. И это счастье, что подобная фигня обнаруживается
уже при компиляции, а не вызывает падение уже готового приложения у пользователя.

Сугубо ИМХО. Поставщик dll отдал её вместе с устаревшим заголовочником. Ошибка производственного процесса. К С++ отношения не имеет. А мы тут всё же обсуждаем С++, точнее один из его приёмов.

Конечно, и на С++ можно написать в одном модуле перечисление, отдать его наружу в виде int. А в другом модуле присвоить int такому же перечислению, но с другим именем. Формально понизили уровень зависимости. По факту — элементарная безграмотность.

Я ждал от вас какого-то очень нетривиально примера.
...
Рейтинг: 0 / 0
Предобъявление typedef-а
    #39981628
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
PetroNotC Sharp

Что решается у вас в данном топике, непонятно.

Уменьшение количества зависимостей единиц компиляции от заголовочных файлов.

Забей, короче.

Звучит как будто вы компилятор пишите.
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Предобъявление typedef-а
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]