Наверное типично для новичков, научите пожалуйста.
Есть шапка класса в h-файле, реализация в cpp-файле. Еще в одном h-файле шапка производного класса, и еще одном cpp-файле его реализация. Базовый класс имеет inline функции. При попытке их вызова в файле с реализацией производного класса компоновщик ругается на неразрешенный внешний символ. Нагуглил, что решается это описанием inline функций в файле с шапкой. Но хотелось бы реализацию с объявлением не смешивать. Научите?
Другие языки программирования и технологии
Ошибка компоновки inline функции класса С++
Я врядли могу подсказать непосредственно по вопросу т. к. не разделяю реализацию с объявлением inline функций.
Просто хочу заметить пару моментов:
1) Если в объявлении класса есть реализация функции, то это автоматически означает что функция inline. Так что непосредственно както выделять что функция inline в таких случаях смысла нет. Другими словами, все функции класса реализованные при объявлении являются inline (не в том смысле что они обязательно будут встраиваться компилятором в места их вызова (иногда это вообще невозможно), а в том смысле как будто вы написали inline перед функцией).
2) Делать inline имеет смысл только ОЧЕНЬ маленькие функции. Обычно это 1, максимум 2 строки. Такие функции имхо лучше оставлять в объявлении, выносить их смысла нет.
Другими словами - то что вы нагуглили на МОЙ взгляд будет наилучшим решением.
P.S. Добавление: глянул стандарт языка, вот что написано - "An inline function shall be defined in every translation unit in which it is odr-used and shall have exactly
the same definition in every case (3.2). [ Note: A call to the inline function may be encountered before its
definition appears in the translation unit. —end note ] If the definition of a function appears in a translation
unit before its first declaration as inline, the program is ill-formed. If a function 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 with external linkage shall have the same address in all
translation units. A static local variable in an extern inline function always refers to the same object.
A string literal in the body of an extern inline function is the same object in different translation units.
[ Note: A string literal appearing in a default argument is not in the body of an inline function merely
because the expression is used in a function call from that inline function. —end note ] A type defined
within the body of an extern inline function is the same type in every translation unit."
Похоже это отвечает на ваш вопрос, если я правильно его понял...
Просто хочу заметить пару моментов:
1) Если в объявлении класса есть реализация функции, то это автоматически означает что функция inline. Так что непосредственно както выделять что функция inline в таких случаях смысла нет. Другими словами, все функции класса реализованные при объявлении являются inline (не в том смысле что они обязательно будут встраиваться компилятором в места их вызова (иногда это вообще невозможно), а в том смысле как будто вы написали inline перед функцией).
2) Делать inline имеет смысл только ОЧЕНЬ маленькие функции. Обычно это 1, максимум 2 строки. Такие функции имхо лучше оставлять в объявлении, выносить их смысла нет.
Другими словами - то что вы нагуглили на МОЙ взгляд будет наилучшим решением.
P.S. Добавление: глянул стандарт языка, вот что написано - "An inline function shall be defined in every translation unit in which it is odr-used and shall have exactly
the same definition in every case (3.2). [ Note: A call to the inline function may be encountered before its
definition appears in the translation unit. —end note ] If the definition of a function appears in a translation
unit before its first declaration as inline, the program is ill-formed. If a function 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 with external linkage shall have the same address in all
translation units. A static local variable in an extern inline function always refers to the same object.
A string literal in the body of an extern inline function is the same object in different translation units.
[ Note: A string literal appearing in a default argument is not in the body of an inline function merely
because the expression is used in a function call from that inline function. —end note ] A type defined
within the body of an extern inline function is the same type in every translation unit."
Похоже это отвечает на ваш вопрос, если я правильно его понял...
Научить чему? inline функция на то и inline, что она не доступна компоновщику. Чего вы хотите, определитесь. Либо она inline и тогда ее определение должно быть доступно в каждой единице трансляции, где она используется, либо она не inline, тогда декларируете в заголовке, а определяете в исходнике. Вы же говорите, я хочу inline функцию, но чтобы она была не inline.
Hupbaha ;d
Я ясно сказал, хочу описание inline функции в cpp-файле. Я знаю что просто так это не делается, но я думал что есть легкий способ. Ну нет и нет, пусть в h-файле висят.
Похожие вопросы
- Статичная функция внутри класса. какие данные будут доступны всем образцам класса?
- Зачем выносить определение тел функций-членов класса в отдельный *.сpp файл?
- Непонятная ошибка в программе на Си (в функции malloc)
- Функции и классы в С++
- Есть ли ошибка? Может ли возникнуть? И вообще приемлимо ли? C++ классы
- При попытке присвоить значение вылетает ошибка. Класс создаеться на другой форме. Подскажите в чем ошибка?
- Вопрос для тех кто знает точный ответ, язык C про функции все подробности вопроса внутри...
- Turbo Pascal. 2 задачи на процедуры и функции
- Вопрос про возвращаемое значение из функции в С++.
- Помогите з функциями в с++ плиииз
Спасибо за помощь.