gpt4 book ai didi

c++ - C++中的部分前向声明

转载 作者:行者123 更新时间:2023-11-28 01:14:05 25 4
gpt4 key购买 nike

我有一个项目 (A) 使用另一个 (B) 的类,但是包含 B 的 header 会使 A 的编译变得非常困惑,而单独的编译工作正常(但在那种情况下我不能在中使用 B 的类A).

B用VS2019的编译器v142编译,A用cuda 10的nvcc编译。

我如何只转发声明几个成员,例如构造函数、属性和方法?

在 A 中,我想在没有 B 的 header 的情况下使用此代码:

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() {/*...*/}

错误示例:

Severity Code Description Project File Line Suppression State Error identifier "NPP_MIRROR_FLIP_ERR" is undefined ShCuSum path_to_solution\D3D12CudaUpdateFull\helper_cuda.h 412 Error name followed by "::" must be a class or namespace name ShCuSum path_to_solution\D3D12CudaUpdateFull\DXSampleHelper.h 3
Error identifier "byte" is undefined ShCuSum path_to_solution\D3D12CudaUpdateFull\DXSampleHelper.h 29
Error name followed by "::" must be a class or namespace name ShCuSum path_to_solution\D3D12CudaUpdateFull\DXSampleHelper.h 31
Error name followed by "::" must be a class or namespace name ShCuSum path_to_solution\D3D12CudaUpdateFull\DXSampleHelper.h 41
Error expected a ";" ShCuSum path_to_solution\D3D12CudaUpdateFull\DXSampleHelper.h 41
Error identifier "file" is undefined ShCuSum path_to_solution\D3D12CudaUpdateFull\DXSampleHelper.h 42
Error identifier "byte" is undefined ShCuSum path_to_solution\D3D12CudaUpdateFull\DXSampleHelper.h 52
Error inline specifier allowed on function declarations only ShCuSum path_to_solution\D3D12CudaUpdateFull\DXSampleHelper.h 63
Error incomplete type is not allowed ShCuSum path_to_solution\D3D12CudaUpdateFull\DXSampleHelper.h 63
Error identifier "ID3D12Object" is undefined ShCuSum path_to_solution\D3D12CudaUpdateFull\DXSampleHelper.h 63
Error identifier "pObject" is undefined ShCuSum path_to_solution\D3D12CudaUpdateFull\DXSampleHelper.h 63
Error expected a ")" ShCuSum path_to_solution\D3D12CudaUpdateFull\DXSampleHelper.h 63
Error expected a ";" ShCuSum path_to_solution\D3D12CudaUpdateFull\DXSampleHelper.h 64
Error identifier "IDXGIFactory2" is undefined ShCuSum path_to_solution\D3D12CudaUpdateFull\DX12CudaSample.h 30
Error identifier "IDXGIAdapter1" is undefined ShCuSum path_to_solution\D3D12CudaUpdateFull\DX12CudaSample.h 30
Error identifier "NPP_BAD_ARG_ERROR" is undefined ShCuSum path_to_solution\D3D12CudaUpdateFull\helper_cuda.h 323 Error identifier "NPP_COEFF_ERROR" is undefined ShCuSum path_to_solution\D3D12CudaUpdateFull\helper_cuda.h 326 Error identifier "NPP_RECT_ERROR" is undefined ShCuSum path_to_solution\D3D12CudaUpdateFull\helper_cuda.h 329 Error identifier "NPP_QUAD_ERROR" is undefined ShCuSum path_to_solution\D3D12CudaUpdateFull\helper_cuda.h 332 Error identifier "NPP_MEM_ALLOC_ERR" is undefined ShCuSum path_to_solution\D3D12CudaUpdateFull\helper_cuda.h 335 Error identifier "NPP_HISTO_NUMBER_OF_LEVELS_ERROR" is undefined ShCuSum path_to_solution\D3D12CudaUpdateFull\helper_cuda.h 338 Error identifier "NPP_INVALID_INPUT" is undefined ShCuSum path_to_solution\D3D12CudaUpdateFull\helper_cuda.h 341 Error identifier "NPP_POINTER_ERROR" is undefined ShCuSum path_to_solution\D3D12CudaUpdateFull\helper_cuda.h 344 Error identifier "NPP_WARNING" is undefined ShCuSum path_to_solution\D3D12CudaUpdateFull\helper_cuda.h 347 Error identifier "NPP_ODD_ROI_WARNING" is undefined ShCuSum path_to_solution\D3D12CudaUpdateFull\helper_cuda.h 350 Error identifier "NPP_MEMFREE_ERR" is undefined ShCuSum path_to_solution\D3D12CudaUpdateFull\helper_cuda.h 403 Error identifier "NPP_MEMSET_ERR" is undefined ShCuSum path_to_solution\D3D12CudaUpdateFull\helper_cuda.h 406 Error identifier "NPP_MEMCPY_ERR" is undefined ShCuSum path_to_solution\D3D12CudaUpdateFull\helper_cuda.h 409 Error (active) E0135 class "Microsoft::WRL::Details::EnableIf" has no member "type" D3D12CudaUpdate C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\winrt\wrl\client.h 379

最佳答案

你不能。您可以改为执行以下操作:

// 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 );
}

对于该属性,最简单的方法是包装到 iCudaInterop 接口(interface)的 2 个抽象方法,getter 和 setter,在实现中获取/设置 m_impl 的字段。

关于c++ - C++中的部分前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59274964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com