DLL Импорт чистой виртуальной структуры и unique_ptr не может скомпилироваться из-за Compressed_pair - PullRequest
0 голосов
/ 11 января 2019

У меня есть два проекта, где мой код находится в одном и экспортируется как DLL, а импортирующий проект является тестовым проектом. В конечном счете я хочу vtable, который я могу импортировать в c, используя только struct.

Моя чистая виртуальная структура выглядит так:

#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 Ответ

0 голосов
/ 11 января 2019

Время для перерыва сегодня.

decltype(&IVirtual_Delete) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...