代码之家  ›  专栏  ›  技术社区  ›  Moia

没有针对完全专用化模板类的离线虚拟方法定义

  •  0
  • Moia  · 技术社区  · 8 年前

    我有这种结构:

    静态库A

    接口.h

    class Interface
    {
       public:
       virtual ~Interface() // no pure virtual dtor
    
       virtual void pureMethod1() = 0;
       virtual void pureMethod2() = 0;
    
       virtual void virtualMethod1();
       virtual void virtualMethod2();
    };
    

    接口.cpp

    include "interface.h"
    Interface::~Interface() = default;
    Interface::virtualMethod1() {}
    Interface::virtualMethod2() {}
    

    使用a的静态lib b

    基线H

    #include "interface.h"
    template<class T>
    class BaseT final : public Interface
    {
       static_assert(false, "can't use this specialization");
    };
    

    专业1.h

    #include "baset.h"
    
    using MyType = BaseT<CustomClass1>;
    
    template<>
    class BaseT<CustomClass1> : public Interface
    {
    public:
       BaseT() = default;
    
       void pureMethod1() final {}
       void pureMethod2() final {}
    };
    

    专业化2.h

    #include "baset.h"
    
    using MyType = BaseT<CustomClass2>;
    
    template<>
    class BaseT<CustomClass2> : public Interface
    {
    public:
       BaseT() = default;
    
       void pureMethod1() final {}
       void pureMethod2() final {}
    };
    

    我在两个完全专业化的课程中都收到了Clang的警告:

    警告:“baset没有脱机虚拟方法定义:它的vtable将在每个翻译单元中发出。”

    为什么要发出这个警告?我没有任何纯虚拟析构函数,并且在基类中提供了一个默认的析构函数。既然我使用的是一个模板,那么我如何避免使用离线虚拟方法呢?

    2 回复  |  直到 8 年前
        1
  •  4
  •   Johan    8 年前

    BaseT

        2
  •  3
  •   V. Kravchenko    8 年前

    #include

    class ImplForCustomClass2 : public Interface
    {
    public:
        virtual void pureMethod1() final override;
        virtual void pureMethod2() final override;
    };
    template<>
    class Base<CustomClass2> : public ImplForCustomClass2
    {};