我有一个项目(A),该项目使用另一个(B)中的类,但是将B的标头包含在内会使A的编译非常混乱,而单独的编译效果很好(但是在这种情况下,我不能在B中使用B的类A)。
B使用VS2019的编译器v142进行编译,A使用cuda 10的nvcc进行编译。
我如何只声明几个成员,例如,构造函数,属性和方法?
在A中,我想在不使用B头的情况下使用此代码:
DX12Cuda = new DX12CudaInterop(ImUtil.ImFeatures.Width, ImUtil.ImFeatures.Height, L"DX12Cuda", funcMessage);
DX12Cuda->CuSurfaceUpdater = [&](cudaSurfaceObject_t o) {UpdateCuSurface(o); };
OnRenderDX12 = [&]() {DX12Cuda->OnRender(); };
DX12Cuda->OnInit(hwnd);
在B:
class DX12CudaInterop
{
public:
DX12CudaInterop(UINT width, UINT height, wstring name, MessageChangedCallback managedDelegate);
function<void(cudaSurfaceObject_t)> CuSurfaceUpdater;
OnInit(HWND hwnd);
OnRender();
}
void DX12CudaInterop::OnInit(HWND hwnd) {/*...*/}
void DX12CudaInterop::OnRender() {/*...*/}
错误示例:
严重性代码描述项目文件行抑制状态 错误标识符“ NPP_MIRROR_FLIP_ERR”为 未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 412 错误名称后跟“ ::”必须是类或名称空间 名称ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 3
错误标识符“字节”为 未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 29
错误名称后跟“ ::”必须是类或名称空间 名称ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 31
错误名称后跟“ ::”必须是类或名称空间 名称ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 41
预期错误a “;” ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 41
错误标识符“文件”为 未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 42
错误标识符“字节”为 未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 52
函数声明中允许错误内联说明符 仅ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 63
错误不完整类型不是 允许ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 63
错误标识符“ ID3D12Object”为 未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 63
错误标识符“ pObject”为 未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 63
预期错误a “)” ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 63
预期错误a “;” ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 64
错误标识符“ IDXGIFactory2”为 未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DX12CudaSample.h 30
错误标识符“ IDXGIAdapter1”为 未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DX12CudaSample.h 30
错误标识符“ NPP_BAD_ARG_ERROR”为 未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 323 错误标识符“ NPP_COEFF_ERROR”为 未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 326 错误标识符“ NPP_RECT_ERROR”为 未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 329 错误标识符“ NPP_QUAD_ERROR”为 未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 332 错误标识符“ NPP_MEM_ALLOC_ERR”为 未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 335 错误标识符“ NPP_HISTO_NUMBER_OF_LEVELS_ERROR”为 未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 338 错误标识符“ NPP_INVALID_INPUT”为 未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 341 错误标识符“ NPP_POINTER_ERROR”为 未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 344 错误标识符“ NPP_WARNING”为 未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 347 错误标识符“ NPP_ODD_ROI_WARNING”为 未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 350 错误标识符“ NPP_MEMFREE_ERR”为 未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 403 错误标识符“ NPP_MEMSET_ERR”为 未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 406 错误标识符“ NPP_MEMCPY_ERR”为 未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 409 错误(活动)E0135类“ Microsoft :: WRL :: Details :: EnableIf”没有成员“类型” D3D12CudaUpdate C:\ Program Files (x86)\ Windows Kits \ 10 \ Include \ 10.0.18362.0 \ winrt \ wrl \ client.h 379
答案 0 :(得分:2)
您不能。您可以改用以下方法:
// interop.h, shared across the project
class iCudaInterop
{
public:
virtual ~iCudaInterop() { }
virtual void OnInit( HWND hwnd ) = 0;
virtual void OnRender() = 0;
};
extern std::unique_ptr<iCudaInterop> createInterop( UINT width, UINT height, const std::wstring& name, MessageChangedCallback del );
// interop.cpp, only in project B
#include "interop.h"
class CudaInterop : public iCudaInterop
{
DX12CudaInterop m_impl;
public:
CudaInterop( UINT width, UINT height, const std::wstring& name, MessageChangedCallback del ) :
m_impl( width, height, name, del ) { }
~CudaInterop() = default;
void OnInit( HWND hwnd ) override { m_impl.OnInit( hwnd ); }
void OnRender() override { m_impl.OnRender(); }
};
std::unique_ptr<iCudaInterop> createInterop( UINT width, UINT height, const std::wstring& name, MessageChangedCallback del )
{
return std::make_unique<CudaInterop>( width, height, name, del );
}
对于该属性,最简单的方法是在实现get / set m_impl的字段中,将其包装到iCudaInterop接口的2个抽象方法中,getter和setter。