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

由于压缩的_对,纯虚拟结构和唯一_ptr的dll导入无法编译

  •  1
  • Johannes  · 技术社区  · 6 年前

    我有两个项目,其中我的代码在一个项目中,作为一个dll导出,导入项目是一个测试项目。最后,我想要一个vtable,它可以导入到c中,并且只使用一个结构。

    我的纯虚拟结构如下所示:

    #ifdef DLL_EXPORTS
    #define MyAPI  __declspec( dllexport )
    #else DLL_EXPORTS
    #define MyAPI  __declspec( dllimport  )
    #endif DLL_EXPORTS
    
    struct MyAPI IVirtual
    {
        virtual int GetNumber() = 0;
        virtual ~IVirtual() = 0;
    };
    
    MyAPI IVirtual * IVirtual_New(int);
    MyAPI void IVirtual_Delete(IVirtual *);
    

    这有一个DLL的实现:

    #include "Virtual.h"
    
    struct Concrete : IVirtual
    {
        int n;
        Concrete(int n) : n(n) { }
        virtual int GetNumber() { return n; }
        virtual ~Concrete() {}
    };
    
    IVirtual::~IVirtual() {}
    
    MyAPI IVirtual * IVirtual_New(int n)
    {
        auto that = new Concrete(n);
        return that;
    }
    
    MyAPI void IVirtual_Delete(IVirtual * that)
    {
        auto fingerscrossed = static_cast<Concrete*>(that);
        delete fingerscrossed;
    }
    

    测试项目导入DLL。SharedPointer测试编译并确认断言。

    #include "CppUnitTest.h"
    #include <memory>
    #include <MyDLL/Virtual.h>
    
    using namespace Microsoft::VisualStudio::CppUnitTestFramework;
    
    namespace UsageTest
    {       
        TEST_CLASS(UsageTest)
        {
        public:
            TEST_METHOD(SharedConstructor)
            {
                //looks ok - tests pass
                std::shared_ptr<IVirtual> sptr(IVirtual_New(4), IVirtual_Delete);
                Assert::AreEqual(4, sptr->GetNumber());
            }
    
            TEST_METHOD(UniqueConstructor)
            {
                std::unique_ptr<IVirtual, decltype(IVirtual_Delete)> uptr(IVirtual_New(6), IVirtual_Delete);
                Assert::AreEqual(6, uptr->GetNumber());
            }
    
        };
    }
    

    但是当我添加 UniqueConstructor 方法停止测试项目的编译。

    C2207: 'std::_Compressed_pair<_Ty1,_Ty2,false>::_Myval1': a member of a class template cannot acquire a function type
    

    我假设这与析构函数有关,但我无法确定到底发生了什么。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Johannes    6 年前

    今天是休息的时间。

    decltype(&IVirtual_Delete)