gpt4 book ai didi

c++ - 如何转发声明第三方结构

转载 作者:太空宇宙 更新时间:2023-11-04 11:35:46 24 4
gpt4 key购买 nike

在我的原始代码中,我引用了 ClassOne 头文件中的第三方 .H,一切正常。现在,我收到一个新要求,不允许我在 ClassOne 头文件中引用第三方 .H。这样我的代码的使用者(即 ClassOne)就不必间接包含第三方 .H 文件。我尝试了以下修改,但它不起作用。

示例代码如下:

// third_party.h
struct PPP
{
int x;
int y;
}; // without default constructor

// Original code!
//////////////////////////////////////////////
// ClassOne.h // my class
#include <third_party.h> // refer to the .H in header file
namespace X
{
class ClassOne
{
...

private:
boost::scoped_ptr<PPP> m_scpPPP;
};
}
// ClassOne.cpp
#include <third_party.h>
namespace X
{
ClassOne::ClassOne()
{
m_scpPPP.reset( new PPP() ); // fine
}
...
}

// Modified code!
==========================================================
// ClassOne.h
struct PPP; // error C2371: 'PPP' : redefinition; different basic types
namespace X
{
class ClassOne
{
...

private:
boost::scoped_ptr<PPP> m_scpPPP;
};
}

// ClassOne.cpp
#include <third_party.h>
namespace X
{
ClassOne::ClassOne()
{
m_scpPPP.reset( new PPP() ); // now see errors.
// error C2512: 'PPP' : no appropriate default constructor available
}
...
}

问题1>第三方struct类型PPP应该在哪里转发声明?

问题 2> 为什么编译器现在提示没有默认构造函数的 PPP?

最佳答案

实例化具有不完整类型的模板不是标准行为,因此它不应该工作 boost::scoped_ptr

话虽如此,unique_ptr 有一个特殊的规则,允许采用不完整的类型。如果你使用它(而不是 boost::scoped_ptr),那么它是这样完成的:

// forward declaration of PPP, assuming c++ header
struct PPP;

namespace X
{

class ClassOne
{
...

private:
std::unique_ptr<PPP> m_scpPPP;
};
}

关于c++ - 如何转发声明第三方结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23114046/

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