В настоящее время у меня есть два проекта: приложение и статическая библиотека, используемые этим проектом. В моей статической библиотеке есть что-то вроде этого:
// interface.h
struct IInterface {
virtual ~IInterface() = default;
virtual void foo() = 0;
};
// baseclass.h
template < class T > struct BaseClass : public IInterface {
virtual ~BaseClass() = default;
virtual void foo() override final;
protected:
virtual void onFoo() = 0;
};
template < class T > BaseClass< T >::foo() {
// some other code here
onFoo();
}
// derivedclass.h
struct SomeStruct { /* ... */ };
struct DerivedClass : public BaseClass< SomeStruct > {
protected:
virtual void onFoo() override final;
}
// derivedclass.cpp
void DerivedClass::onFoo() {
// ...
}
После того, как я попытался скомпилировать это как статическую библиотеку, все было в порядке. Затем я попытался статически связать эту библиотеку с моим приложением и использовать эти классы, и в Visual Studio 2017 произошли следующие предупреждения и ошибки:
Warning C4505 ... : unreferenced local function has been removed
, что, в свою очередь, вызвало ошибку компоновщика unresolved external symbol
. Похоже, компилятор удалил функцию foo
. Что-то не так с этим кодом? Почему компилятор считает, что моя функция является локальной и не имеет ссылок?