LINUX.ORG.RU

Функция-шаблон С++ в статической библиотеке?

 ,


0

3

Пишу под Debian, набросал библиотечку с набором функций. По ходу дела понадобилось в некоторых функциях работать с различными типами данных, описал как шаблоны. Теперь undefined reference при сборке проекта, который эту библиотеку подключает и вызывает функции-шаблоны. Можно ли это обойти? Или шаблоны только в рамках одного проекта могут быть используемы?


Ответ на: комментарий от Deleted

А я не пытался ничего доказать. Я, естественно, считаю, что шаблоны и макросы - вещи разные, но доказывать это не собираюсь. Просто хотел увидеть доказательство противоположной точки зрения - вдруг я не прав. Но доказательства не привел ни i-rinat, ни ты.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Кстати, насчёт попыток:

template<typename T> volatile T var = 0;

int main()
{
	return var<int> + var<float>;
}
0000000000000690 <main>:
 690:   55                      push   %rbp
 691:   48 89 e5                mov    %rsp,%rbp
 694:   8b 05 92 09 20 00       mov    0x200992(%rip),%eax        # 20102c <var<int>>
 69a:   66 0f ef c0             pxor   %xmm0,%xmm0
 69e:   f3 0f 2a c0             cvtsi2ss %eax,%xmm0
 6a2:   f3 0f 10 0d 86 09 20    movss  0x200986(%rip),%xmm1        # 201030 <var<float>>
 6a9:   00 
 6aa:   f3 0f 58 c1             addss  %xmm1,%xmm0
 6ae:   f3 0f 2c c0             cvttss2si %xmm0,%eax
 6b2:   5d                      pop    %rbp
 6b3:   c3                      retq   
 6b4:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
 6bb:   00 00 00 
 6be:   66 90                   xchg   %ax,%ax
Различные адреса и есть результат подстановок

Deleted
()
Ответ на: комментарий от tailgunner

Но доказательства не привел ни i-rinat, ни ты

Ну хз, мне это кажется довольно очевидным

Deleted
()
Ответ на: комментарий от Deleted

Но доказательства не привел ни i-rinat, ни ты

Ну хз, мне это кажется довольно очевидным

Кому-то очевидно, что Земля плоская.

Кстати, насчёт попыток:

Ну наконец-то.

mov 0x200992(%rip),%eax # 20102c <var<int>>

movss 0x200986(%rip),%xmm1 # 201030 <var<float>>

Итак, входная последовательность Си++-шаблона - это Си++-код, выходная - код x86_64?

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от Deleted

Можно и без дизассемблера:

g++ -cc1 -std=c++14 -ast-print volatile.c++
template <typename T> volatile T var = 0;
int main() {
    return var<int> + var<float>;
}
volatile int var = 0;
volatile float var = 0;

Miguel ★★★★★
()
Ответ на: комментарий от tailgunner

Конкретно в этом примере, входная - обращение к переменной, выходная - константа в секции данных

Deleted
()
Ответ на: комментарий от Deleted

Конкретно в этом примере, входная - обращение к переменной, выходная - константа в секции данных

Константы? Я вижу ассемблерные инструкции.

tailgunner ★★★★★
()
Ответ на: комментарий от Deleted

Не начинай сначала, а?

А ты выражайся ясно.

В этих инструкциях ссылки на эти константы
0x200992(%rip)
0x200986(%rip)

Прекрасно. Но ведь обычный код тоже генерирует ссылки на константы?

int x;

int square(int num) {
    return x;
}

square(int):
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], edi
        mov     eax, DWORD PTR x[rip]
        pop     rbp
        ret

Так в чем принципиальное отличие шаблонов («макросов» по-твоему)?

tailgunner ★★★★★
()
Ответ на: комментарий от Deleted

в чем принципиальное отличие шаблонов

Единообразные входные последовательности

Что? Пример, пожалуйста. Что является «входными последовательностями» шаблона var и в каком смысле они «единообразные»?

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Входные последовательности макросов - я о них(подвыражение обращения к переменной). А единообразны они синтаксически

Deleted
()
Ответ на: комментарий от Deleted

Входные последовательности макросов - я о них(подвыражение обращения к переменной

Я просил пример. Итак, в выражении: var<int> + var<float>, что является «входными последовательностями макросов»? Или, если в этом выражении «входных последовательностей макросов» нет, приведи пример, где они есть.

tailgunner ★★★★★
()
Ответ на: комментарий от Deleted

Входной последовательностью шаблона var является var<int>? O_o Т.е. сам шаблон является частью своей входной последовательности?

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от Deleted

Входной последоваительностью шаблона

Входной последовательностью макроса

Да неважно, у тебя же шаблон является макросом. Впрочем, я могу переформулировать: входной последовательностью макроса var является var<int>? O_o Т.е. сам макрос является частью своей входной последовательности?

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Входной последовательностью макроса template<typename T> volatile var = 0 является var<int>, var - всего лишь имя

Deleted
()
Ответ на: комментарий от Deleted

Входной последовательностью макроса template<typename T> volatile var = 0 является var<int>, var - всего лишь имя

Мде. Я окончательно перестал тебя понимать. Засчитай мне слив еще раз.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Засчитай мне слив еще раз

Пожайлуста )

(gdb) p ++sliv_counter
$1 = 3
Я о том, что var сам по себе - ни макросом, ни входной последовательностью не является. Ну и может это поможет:
#define F(A) ...

F(arg)  //input sequence contents 'F'
та же телега

Deleted
()
Ответ на: комментарий от Deleted

var сам по себе - ни макросом, ни входной последовательностью не является.

Офигеть. А чем он является? Понятно, что именем, но к чему относится это имя?

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

к чему относится это имя?

К макросу. Но какое это имеет значение в контексте

Т.е. сам макрос является частью своей входной последовательности?

относиться != является. А в том что имя является частью входной последовательности ничего необычного нет

P. S. Прекрати исправлять сообщения, ломая совместимость - отвечать же неудобно )

Deleted
()
Ответ на: комментарий от Deleted

офигеть, что вы там дунули ? вы хоть понимаете как устроен компилятор и где работает макрос а где темплейт ? или для вас весь компилятор это макро подстановки ?)))

anonymous
()
Ответ на: комментарий от anonymous

или для вас весь компилятор это макро подстановки ?)))

Думаю, да.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

входной последовательностью макроса var является var<int>? O_o Т.е. сам макрос является частью своей входной последовательности?

var сам по себе - ни макросом, ни входной последовательностью не является

Офигеть. А чем он является? Понятно, что именем, но к чему относится это имя?

var это имя или макрос - я так и не понял твоего хода мыслей

Deleted
()
Ответ на: комментарий от tailgunner

Ник же упомянул.

А если к теме, то ждать было бессмысленно.

Если за определение макроса взять их реализацию в Си, то никак ты к простой подстановке текста гигиену не прикрутишь, как ни старайся. Поэтому в такой аксиоматике высказывание «шаблоны это макросы с гигиеной» является парадоксом.

Хочешь парадоксов — возьми классические. Их уже давно напридумывали.

i-rinat ★★★★★
()
Ответ на: комментарий от Deleted

пардон у вас википедия сломалась ?
https://en.wikipedia.org/wiki/Template_metaprogramming [quote[Template metaprogramming is Turing-complete, meaning that any computation expressible by a computer program can be computed, in some form, by a template metaprogram.[3]

Templates are different from macros. A macro, which is also a compile-time language feature, generates code in-line using text manipulation and substitution. о том на каких уровнях работают макросы и темплейты - изучите, это об устройстве компиляторов

anonymous
()
Ответ на: комментарий от Deleted

а так у вас своя математика ? тогда вам в другую песочницу, понимаете ли, что бы ввязываться в споры нужно руководствоваться общими правилами а не своими выдуманными. у вас 2+2=5, откуда это знать тем кто в трейде и считал что 2+2=4 ? ну кроме вас ?

anonymous
()
Ответ на: комментарий от Deleted

мне ? мне все ясно, у меня мир такой же как в википедии, где макрос это текст самбститушин а темплейт тюринг комплит, и текст самбститушин не может быть приближенным равенством тюринг комплит, у вас он равен, пардон но у вас и окружающего мира свои системы отчета, поэтому и продолжать какие то объяснения и споры бесполезно, это все равно что вы будете доказывать что 2+2~=5 а другие что 2+2=4

anonymous
()
Ответ на: комментарий от Miguel

На самом деле — AST.

Лол. Там написано, что в лиспах макры работают на уровне AST. Это и позволяет расширять синтаксис лиспов, в отличии от убогих макр в це или цепепе. Это всем известно, к чему ты это тут привёл - не ясно.

Ну а результат работы макросов - это код на целевом языке.

azelipupenko
()
Ответ на: комментарий от anonymous

То, что вы не замечаете сходства и не понимаете смысл слова «приближенно» не означает вашей правоты. А конкретики от вас так и нет, видимо, действительно

объяснения и споры бесполезны

Deleted
()
Ответ на: комментарий от azelipupenko

макры работают на уровне AST.

Ну а результат работы макросов - это код на целевом языке.

Взаимоисключающие параграфы такие взаимоисключающие...

Miguel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.