首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向前声明boost::signals2::signal<void()>

向前声明boost::signals2::signal<void()>
EN

Stack Overflow用户
提问于 2015-11-14 13:19:16
回答 2查看 384关注 0票数 4

我正在尝试转发声明boost信号,所以当信号不被使用时,我不需要包括头文件。

我原以为这会奏效:

代码语言:javascript
复制
namespace boost
{
namespace signals2
{
  class signal<void()>;
}
}

但是会得到错误"signal is not a template“

有没有办法做到这一点?

编辑:更多信息:我正在尝试做的一个示例,主要是将#include排除在我的大部分代码库之外。

代码语言:javascript
复制
#include <memory>

/// Forward declaration here:

/// .H File
class ExampleClass
{
public:
  boost::signals2::signal<void()> & GetSignal();

protected:
  std::shared_ptr<boost::signals2::signal<void()>> _signal_pointer;
};

.CPP

代码语言:javascript
复制
#include "boost/signals2.hpp"
boost::signals2::signal<void()> & ExampleClass::GetSignal()
{
  if (!_signal_pointer)
  {
    _signal_pointer.reset(new boost::signals2::signal<void()>());
  }

  return *_signal_pointer;
}
EN

回答 2

Stack Overflow用户

发布于 2015-11-14 20:27:33

如果添加template<>,就可以解决这个具体的编译器错误

代码语言:javascript
复制
namespace boost
{
namespace signals2
{
  template<typename T>
  struct signal;

  template<>
  class signal<void()>;
}
}

因为在声明template的专门化之前,您应该自己声明template。然后实际上你可以只写:

代码语言:javascript
复制
namespace boost
{
namespace signals2
{
  template<typename T>
  struct signal;
}
}

因为您只使用了转发声明,而不是实现template,所以专门化它是没有意义的。

但这对你并没有真正的帮助。是的,如果你不使用boost::signals2,编译器错误就会消失,但是如果你使用这样的包含文件,在包含“真正的”boost::singals2的地方,你会得到关于signal重新声明的错误,这是因为真正的boost::signals2::signal采用了5-7个模板参数,不准确地记住了,并且对大多数模板参数有一些默认值。

票数 -1
EN

Stack Overflow用户

发布于 2015-11-14 21:44:20

Signals2不是被设计成“pimpl”的。它被设计成出现在你的公共界面中。

如果您不想这样,可以将其包装在您自己的pimpl-wrappers中。但你应该先问问自己“为什么”。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33705382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档