2013-09-04 8 views
0

В библиотеке я следующая в заголовке:Вызов без встроенных функций от встроенных функций

// button.hpp 

class ExtraButtons 
{ 
public: 
    static inline void show() { setShown(true); } 
    static inline void hide() { setShown(false); } 
    static void setShown(bool shown); 
}; 

и следующая в исходном файле:

#include "button.hpp" 

void ExtraButtons::setShown(bool shown) 
{ 
} 

Библиотека компилируется нормально. Однако, когда я использую библиотеку и я включаю button.hpp, я получаю эту ошибку от setShown звонков в show() и hide():

undefined reference to `ExtraButtons::setShown(bool)' 

я могу решить эту проблему путем удаления инлайны из show() и hide() и их определения в исходном файле, как и в обычном порядке, ИЛИ, делая также setShown. Почему это так? Это единственные решения?

+1

Если вы хотите, чтобы это было связано, вам необходимо предоставить * оба * объектных файла в компоновщик. Как вы ссылаетесь на компоновщик? –

+0

Мне трудно поверить, что 'inline' будет иметь такой большой эффект. По моему опыту, 'inline' - это скорее напоминание о себе, что вы ожидаете, что функция будет скомпилирована inline, а не что-то еще. –

+2

@MrLister: Цель 'inline' - разрешить определения в нескольких единицах перевода (что часто необходимо, чтобы компилятор мог встроить его). Но вы правы, что это не должно иметь никакого значения здесь. –

ответ

1

Похоже, либо вы не связывая библиотеки бинарной в свой проект, или вашего фактического определения для setShown является inline void ExtraButtons::setShown(bool shown) (обратите внимание, что он случайно отмечен встроенным в исходном файле).

Смежные вопросы