Здравствуйте, Basil2, Вы писали:
B>Окей, разъясни тогда плз почему.
Потому что каждый *.cpp компилируется независимо исходя из доступной для него информации. Если ты не включил в него прототип своей функции, или саму функцию, или *.h с прототипом и т.п., то в получившемся объектнике будет использована та функция, которая была доступна (т.е. шаблонная). Компилятор не смотрит в соседние единицы трансляции.
Здравствуйте, wander, Вы писали:
B>>Окей, разъясни тогда плз почему. W>Потому что каждый *.cpp компилируется независимо исходя из доступной для него информации. Если ты не включил в него прототип своей функции, или саму функцию, или *.h с прототипом и т.п., то в получившемся объектнике будет использована та функция, которая была доступна (т.е. шаблонная). Компилятор не смотрит в соседние единицы трансляции.
Так и я об этом. В моем cpp-файле определена моя свободная функция. И она используется, если мой сpp-файл один. Если появлятся другие cpp-файлы, то в моем (!) cpp-файле эта свободная функция работать перестает.
Вот я и спрашиваю — какого х компилятор лезет в другие единицы трансляции и извлекает оттуда какие-то другие функции вместо моей?!
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.
Здравствуйте, Vain, Вы писали:
B>>При этом я хочу, чтобы вызов свободной функции работал независимо от других единиц трансляции, что не требовалось подключать хидер с моей функцией во все существующие cpp-файлы. Не так уж многого ведь хочу? V>Много хочешь. Выборка из набора функций проходит на этапе компиляции.
Тогда почему не работает?
В моем cpp-файле свободная функция определена. И она выбирается, если нет других cpp-файлов. Почему она перестает выбираться при появлении других cpp-файлов?! Ведь "выборка из набора функций проходит на этапе компиляции", а не линковки, так?
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.
Здравствуйте, Basil2, Вы писали:
B>>>При этом я хочу, чтобы вызов свободной функции работал независимо от других единиц трансляции, что не требовалось подключать хидер с моей функцией во все существующие cpp-файлы. Не так уж многого ведь хочу? V>>Много хочешь. Выборка из набора функций проходит на этапе компиляции. B>Тогда почему не работает? B>В моем cpp-файле свободная функция определена. И она выбирается, если нет других cpp-файлов. Почему она перестает выбираться при появлении других cpp-файлов?!
Потому-что компилятор её "не видит" в других cpp-файлах. Чтобы увидел надо объявление поместить выше точки вызова во всех cpp-файлах.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
B>>>>При этом я хочу, чтобы вызов свободной функции работал независимо от других единиц трансляции, что не требовалось подключать хидер с моей функцией во все существующие cpp-файлы. Не так уж многого ведь хочу? V>>>Много хочешь. Выборка из набора функций проходит на этапе компиляции. B>>Тогда почему не работает? B>>В моем cpp-файле свободная функция определена. И она выбирается, если нет других cpp-файлов. Почему она перестает выбираться при появлении других cpp-файлов?! V>Потому-что компилятор её "не видит" в других cpp-файлах. Чтобы увидел надо объявление поместить выше точки вызова во всех cpp-файлах.
Если он ее не видит, то почему он ее использует?!
В этом и проблема: компилятор использует — в моем файле — не мою функцию, а из другого cpp-файла. На Студию я, согласен, зря гнал — gcc также себя ведет. Просто наперво очень странным поведение показалось.
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.
Здравствуйте, Basil2, Вы писали:
V>>Потому-что компилятор её "не видит" в других cpp-файлах. Чтобы увидел надо объявление поместить выше точки вызова во всех cpp-файлах. B>Если он ее не видит, то почему он ее использует?! B>В этом и проблема: компилятор использует — в моем файле — не мою функцию, а из другого cpp-файла.
Как он это может делать если ты сам сказал что её там нет?
К тому же это линкер решает использовать или нет, а вот какую — выбирает компилятор для каждого cpp-файла по отдельности. Отсюда One Definition Rule — если определение одной и той же функции присутствует более чем в одной единице трансляции (cpp-файле) то они обязаны быть одинаковыми. К примеру, инлайн функции во всех единицах трансляции обязаны совпадать.
Ты нарушаешь это правило удаляя часть функций (твою свободную функцию) т.к. она является частью одного большого определения функий с таким же именем (шаблон+твоя свободная функция) а это UB.
Если же тебе надо определение хранить в одном cpp-файле а использовать из разных, то надо как минимум объявить все функции до первого использования (исключение — шаблонная функция, её определение надо определять как и инлайн функцию — до первого использования).
Ты смешал первый способ со вторым, это не будет работать и я уже объяснил почему.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]