纯虚拟结构的 DLL 导入和 unique_ptr 由于 Compressed_pair 无法编译
DLL Import of pure virtual struct and unique_ptr can not compile due to Compressed_pair
我有两个项目,我的代码合二为一,导出为 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。共享指针测试编译并确认断言。
#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
我认为这与析构函数有关,但我无法确定那里到底发生了什么。
今天休息一下。
decltype(&IVirtual_Delete)
我有两个项目,我的代码合二为一,导出为 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。共享指针测试编译并确认断言。
#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
我认为这与析构函数有关,但我无法确定那里到底发生了什么。
今天休息一下。
decltype(&IVirtual_Delete)