在一个项目,我们希望包升Asio座中的一个方式,即采用类或包装。h不包括提高标题。

我们通常使用的指针,并向声明,对包裹的课程。

Foward宣言:

namespace boost
{
  namespace asio
  {
    namespace ip
    {
      class udp;
    }
  }
}

然后宣布的座:

  scoped_ptr<boost::asio::ip::udp::socket> socket_;
  scoped_ptr<boost::asio::ip::udp::endpoint> receiveEp_;

(如果你不知道scoped_ptr,忽略它,问题是平等的标准*指针。)

但这给了一个编译器的错误:

error C2027: use of undefined type 'boost::asio::ip::udp'

我明白这是因为udp实际上不是一个名字空间,但一类本身。我们只希望使用内流虽然任何想法?

有帮助吗?

解决方案

与内的类型你唯一的选择是包裹的一切。隐藏范围的指针自己内部的一个前宣布类。用户将会看到的只有你API和绕过自己的对象,而不是提升对象。

在你的实例,虽然scoped_ptr看起来像私有成员的声明,你可以逃脱,简单:

// header
class SomeClass 
{ 
public:
    SomeClass();
    // stuff   
private: 
    scoped_ptr<class pimpl_bla> _m; 
};

// source
class pimpl_bla
{
public: 
    scoped_ptr<boost::asio::ip::udp::socket> socket_;
};

SomeClass::SomeClass() 
    :_m(new pimpl_bla)
{ 
}

其他提示

如果您正在使用pimpl,为什么要将成员变量放在标题中?套接字和端点类型是否在您的界面中使用?如果它们不是你的界面的一部分,那么pimpl习语的重点在于你没有在头文件中定义一个类的成员变量;它们是实施细节。

我希望在头文件中有这样的东西:

// ...

class MyClass {
public:
    MyClass();
    // .. Other member functions

private:
    struct Imp;
    boost::shared_ptr<Imp> m_imp;   // This is the only member variable.
};

然后在您的实施文件中:

#include <boost/asio/whatever.hpp>

struct MyClass::Imp
{
    scoped_ptr<boost::asio::ip::udp::socket> socket_;
    scoped_ptr<boost::asio::ip::udp::endpoint> receiveEp_;

    // Remainder of implementation class ...
};

// Other implementation details.

要回答您的具体问题,您尝试使用的类型是asio udp类中的typedef,因此编译器需要看到该类的定义才能使用它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top