Re[8]: Explicit instantiation of template template method
От: rg45 СССР  
Дата: 02.03.18 22:38
Оценка:
Здравствуйте, ezdoctor, Вы писали:

E>Ну вот хотя бы мой пример (переносим все в один заголовок и инстанциируем класс одним и тем же типом из двух разных модулей):

E>Сравниваем со случаем, когда в определении класса те же методы объявлены как inline:

E>В первом случае возникнет ошибка линковки (линковщик найдет определение шаблонных методов в двух разных модулях), во втором случае этой ошибки с гарантией не возникнет.


Мне вот даже интересно стало, как ты понял мои слова:

Просто укажи его не в объявляении, а в определении




Конечно же, в первом случае возникает ошибка линковки, потому, ты ключевые слова inline убрал вообще. А вот если бы ты сделал так, как я говорю, то все было бы в порядке:


template<typename T>
class C {
public:
    void memberFunction();

    template <typename S>
    void templateMemberFunction();
};

template<>
inline void C<int>::memberFunction() {
}

template <>
template <>
inline void C<int>::templateMemberFunction<double>() {
}
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[7]: Explicit instantiation of template template method
От: rg45 СССР  
Дата: 03.03.18 04:23
Оценка:
Здравствуйте, rean, Вы писали:

R>> Можешь проверить, обычная inline функция из какого-нибудь пространства имен, не объявленная static, будет имеет один и тот же адрес во всех единицах трансляции.


R>Это благодаря тому что линкер найдет одинаковый код и объединит его, а не потому что так должно быть.


Это так, потому, что это является требованиям стандарта языка:

5.6 Program and linkage
9 Two names that are the same (Clause 6) and that are declared in different scopes shall denote the same variable, function, type, template or namespace if
(9.1) — both names have external linkage or else both names have internal linkage and are declared in the same translation unit; and


И функция не перестает иметь external linkage только оттого, что ее объявили inline. inline — это всего лишь способ сказать линкеру, чтобы он не удивлялся, когда будет встречать дубликаты определений в разных единицах трансляции. Указатель на inline функцию может быть использован в качестве параметра шаблона и это значение обязано быть одинаковым во всей программе.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[8]: Explicit instantiation of template template method
От: rean  
Дата: 03.03.18 12:47
Оценка:
deleted
Отредактировано 22.04.2019 9:16 deleted2 . Предыдущая версия .
Re[9]: Explicit instantiation of template template method
От: rg45 СССР  
Дата: 03.03.18 12:51
Оценка:
Здравствуйте, rean, Вы писали:

R>При чем тут указатель на функцию? Читайте внимательно то что я писал. По пунктам, повторюсь и разжую:


Читать вдумчиво, с карандашом в руке, как здесь
Автор: rean
Дата: 24.02.18
?
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 03.03.2018 12:52 rg45 . Предыдущая версия .
Re[9]: Explicit instantiation of template template method
От: rg45 СССР  
Дата: 03.03.18 12:56
Оценка: +1
Здравствуйте, rean, Вы писали:

R>2. Линкер не сможет найти inline функцию из одного cpp файла в другом. Просто потому что ее имени не существует. Это ограничение языка.


Ты путаешь мягкое с теплым. Функция с external linkage спокойно может быть использована в других единицах трансляции — в этом и состоит сущность внешнего связывания.

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

10.1.6 The inline specifier
6 An inline function or variable shall be defined in every translation unit in which it is odr-used and shall have exactly the same definition in every case (6.2). [ Note: A call to the inline function or a use of the inline variable may be encountered before its definition appears in the translation unit. —end note ] If the definition of a function or variable appears in a translation unit before its first declaration as inline, the program is ill-formed. If a function or variable with external linkage is declared inline in one translation unit, it shall be declared inline in all translation units in which it appears; no diagnostic is required. An inline function or variable with external linkage shall have the same address in all translation units. [ Note:A static local variable in an inline function with external linkage always refers to the same object. A type defined within the body of an inline function with external linkage is the same type in every translation unit. —end note ]

--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 03.03.2018 13:33 rg45 . Предыдущая версия . Еще …
Отредактировано 03.03.2018 13:12 rg45 . Предыдущая версия .
Отредактировано 03.03.2018 13:02 rg45 . Предыдущая версия .
Отредактировано 03.03.2018 12:59 rg45 . Предыдущая версия .
Re[10]: Explicit instantiation of template template method
От: rean  
Дата: 03.03.18 13:32
Оценка:
deleted
Отредактировано 22.04.2019 9:16 deleted2 . Предыдущая версия .
Re[11]: Explicit instantiation of template template method
От: rg45 СССР  
Дата: 03.03.18 13:34
Оценка: +3
Здравствуйте, rean, Вы писали:


R>Не надо тыкать.


Я придерживаюсь правил, принятых на этом форуме.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[11]: Explicit instantiation of template template method
От: rg45 СССР  
Дата: 03.03.18 13:38
Оценка:
Здравствуйте, rean, Вы писали:


R>Не надо тыкать. Жду от вас результатов компиляции вот этих трех файлов:


Ну будет ошибка линковки, это ясно и без компиляции. Потому что, как я писал выше
Автор: rg45
Дата: 03.03.18
:

10.1.6 The inline specifier
6 An inline function or variable shall be defined in every translation unit


Правила языка нарушать нельзя, кто б спорил. И?
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 03.03.2018 13:42 rg45 . Предыдущая версия .
Re[12]: Explicit instantiation of template template method
От: rean  
Дата: 03.03.18 14:07
Оценка: :)
deleted
Отредактировано 22.04.2019 9:16 deleted2 . Предыдущая версия .
Re[9]: Explicit instantiation of template template method
От: rg45 СССР  
Дата: 03.03.18 14:14
Оценка:
Здравствуйте, rean, Вы писали:

R>1. Функция, объявленная как inline, транслируется только в пределах одной единицы трансляции. Что автоматически означает, что в каждой единице трансляции будет свой код.

R>2. Линкер не сможет найти inline функцию из одного cpp файла в другом. Просто потому что ее имени не существует. Это ограничение языка.

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

1 The text of the program is kept in units called source files in this International Standard. A source file together with all the headers (20.5.1.2) and source files included (19.2) via the preprocessing directive #include, less any source lines skipped by any of the conditional inclusion (19.1) preprocessing directives, is called a translation unit. [ Note: A C++ program need not all be translated at the same time. —end note ]


И да, inline функции должны быть в ключены в каждую единицу трансляции, в которой они используются.

Линкер же не работает с единицами трансляции — линкер работает с объектными файлами. И состав этих файлов — это глубоко implementation defined level. Что в них находится и как работает линкер, мы не знаем. Знаем мы только то, что я писал уже раньше:

10.1.6 The inline specifier
6 An inline function or variable shall be defined in every translation unit in which it is odr-used and shall have exactly the same definition in every case (6.2). [ Note: A call to the inline function or a use of the inline variable may be encountered before its definition appears in the translation unit. —end note ] If the definition of a function or variable appears in a translation unit before its first declaration as inline, the program is ill-formed. If a function or variable with external linkage is declared inline in one translation unit, it shall be declared inline in all translation units in which it appears; no diagnostic is required. An inline function or variable with external linkage shall have the same address in all translation units. [ Note:A static local variable in an inline function with external linkage always refers to the same object. A type defined within the body of an inline function with external linkage is the same type in every translation unit. —end note ]

--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 03.03.2018 14:17 rg45 . Предыдущая версия .
Re[13]: Explicit instantiation of template template method
От: rg45 СССР  
Дата: 03.03.18 14:18
Оценка:
Здравствуйте, rean, Вы писали:

R>Надо откомпилировать, чтобы убедиться о том, что не откомпилируется. А потом освежить свою память, порыскав в интернете или хотя бы прочитав то что я писал.


Вот объясни мне, пожалуйста, откуда у тебя такая уверенность, что это я должен выполнять твои задания, а не наоборот?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[10]: Explicit instantiation of template template method
От: rean  
Дата: 03.03.18 14:23
Оценка: :))) :)
deleted
Отредактировано 22.04.2019 9:16 deleted2 . Предыдущая версия .
Re[14]: Explicit instantiation of template template method
От: rean  
Дата: 03.03.18 14:31
Оценка:
deleted
Отредактировано 22.04.2019 9:16 deleted2 . Предыдущая версия .
Re[15]: Explicit instantiation of template template method
От: rg45 СССР  
Дата: 03.03.18 15:39
Оценка:
Здравствуйте, rean, Вы писали:

R>Откомпилируете, увидите сообщение об ошибке. Прочтете его. Потом промотаете по треду и найдете мои фразы, где я сообщаю о том почему видите сообщение об ошибке.

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

У меня к тебе встречное предложение. Чтобы разрешить наш спор, мы можем даже временно пойти на такое страшное преступление, как нарушение ODR. Определим по-разному одну и ту же inline функцию в двух единицах трансляции и убедимся, что каждом из модулей будет вызываться одна и та же функция, а не в каждом своя, как ты, вероятно, ожидаешь.

// main2.cpp
#include <iostream>

inline void foo()
{
   std::cout << 2 << std::endl;
}

void main2()
{
   foo();
}


// main.cpp
#include <iostream>

void main2();

inline void foo()
{
   std::cout << 1 << std::endl;
}

int main()
{
   main2();
   foo();
}
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[16]: Explicit instantiation of template template method
От: rean  
Дата: 03.03.18 17:21
Оценка:
deleted
Отредактировано 22.04.2019 9:15 deleted2 . Предыдущая версия .
Re[17]: Explicit instantiation of template template method
От: rg45 СССР  
Дата: 03.03.18 17:30
Оценка: +2
Здравствуйте, rean, Вы писали:

R>Остапа понесло. Пятая попытка изменить смысл. Теперь пришлось использовать новое супер-оружие «не одинаковые инлайны».

R>Меня не интересуют ни адреса inline функций, ни виртуальные inline функции ни какие-либо еще.

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

R>rg45 — вы зануда. Неужели вам никак не ясно, что я не хочу с вами обсуждать все эти, возможно интересные вам случаи применения inline?

R>Найдите другого собеседника и с ним и обсуждайте. Я лишь отвечал автору сообщения и только в рамках обозначенного контекста применения inline — когда inline функцию не нашел линковщик.

Видишь ли, все просто — не хочешь общаться — не пиши. Тебя же никто не принуждает к этому.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 03.03.2018 17:33 rg45 . Предыдущая версия . Еще …
Отредактировано 03.03.2018 17:33 rg45 . Предыдущая версия .
Отредактировано 03.03.2018 17:31 rg45 . Предыдущая версия .
Re[18]: Explicit instantiation of template template method
От: rean  
Дата: 03.03.18 18:33
Оценка:
deleted
Отредактировано 22.04.2019 9:15 deleted2 . Предыдущая версия .
Re[19]: Explicit instantiation of template template method
От: rg45 СССР  
Дата: 03.03.18 18:47
Оценка: +3
Здравствуйте, rean, Вы писали:

R>Это отличается от рассматриваемого случая, как и все остальные случаи. Я говорил четко в пределах случая, когда инлайн функция ищется линковщиком по причине того что отсутствует в текущей еденице трансляции.

R>Рассматривался один узкий конкретный случай. Другие случаи мне не интересны. Если уловили в этом другие смыслы — это ваше. Так что что такое «Что полностью опровергает твои утверждения, сделанные здесь, об использовании inline функций» — понятия не имею. Я про это вообще ничего не говорил. Это ваши домыслы и желание выискивать недочеты у других.

Все, что ты говорил, записано:

http://rsdn.org/forum/cpp/7070363.1
Автор: rean
Дата: 03.03.18


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


http://rsdn.org/forum/cpp/7070608.1
Автор: rean
Дата: 03.03.18


2. Линкер не сможет найти inline функцию из одного cpp файла в другом. Просто потому что ее имени не существует. Это ограничение языка.


И то, и другое — чушь, не имеющая к реальности никакого отношения. Почему — я уже объяснил ссылками на стандарт языка и подкрепил практическим примером.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 03.03.2018 19:04 rg45 . Предыдущая версия .
Re[20]: Explicit instantiation of template template method
От: rean  
Дата: 04.03.18 10:39
Оценка: -1
deleted
Отредактировано 22.04.2019 9:15 deleted2 . Предыдущая версия .
Re[21]: Explicit instantiation of template template method
От: rg45 СССР  
Дата: 04.03.18 11:24
Оценка:
Здравствуйте, rean, Вы писали:

R>>Все, что ты говорил, записано:


R>>http://rsdn.org/forum/cpp/7070363.1
Автор: rean
Дата: 03.03.18


R>>

R>>Инлайн работает только в пределах одной единицы компиляции. Иначе говоря, в каждом CPP файле будет своя копия, такая же как в другом файле, но своя копия.
R>>Поэтому найтись инлайн из одного cpp в другом не может никак.


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


Что я вырвал из контекста? Пройди по ссылке — это полный текст первого же твоего сообщения в той ветке. И, кстати говоря, в ветке, начатой мной.

И, если ты не в курсе, выяснение адреса функции — это как раз то, чем линкер и занимается:

https://ru.wikipedia.org/wiki/Компоновщик

Для большинства компиляторов, один объектный файл является результатом компиляции одного файла с исходным кодом. Если программа собирается из нескольких объектных файлов, компоновщик собирает эти файлы в единый исполнимый модуль, вычисляя и подставляя адреса вместо символов, в течение времени компоновки (статическая компоновка) или во время исполнения (динамическая компоновка).


R>Вот ведь наглец.

R>вы неадекват, представляющий опасность для общества.
R>Вон, уже плюсик поставили придурку
R>Вот же придурошный
R>Можете своими ссылками и примерами подтереться,
R>только жопу свою не порвите

Ты в самом деле полагаешь, что оскорбления в мой адрес могут дать тебе какое-то преимущество? Или это все уже — полная потеря контроля над собой?
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 04.03.2018 12:13 rg45 . Предыдущая версия . Еще …
Отредактировано 04.03.2018 12:06 rg45 . Предыдущая версия .
Отредактировано 04.03.2018 11:50 rg45 . Предыдущая версия .
Отредактировано 04.03.2018 11:49 rg45 . Предыдущая версия .
Отредактировано 04.03.2018 11:26 rg45 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.