Visual Studio从静态库的类模板中删除我的虚拟函数

时间:2019-03-19 20:10:49

标签: visual-studio c++17 linker-errors

我目前有两个项目,该项目使用的应用程序和静态库。在我的静态库中,有一些类似的东西:

// 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函数。这种代码有什么问题吗?为什么编译器认为我的函数是本地的且未引用?

0 个答案:

没有答案