Foward声明boost :: signals2 :: signal <void()>

时间:2015-11-14 05:19:16

标签: c++ templates boost

我正在尝试转发声明升压信号,因此在不使用信号时我不需要包含头文件。

我认为这样可行:

namespace boost
{
namespace signals2
{
  class signal<void()>;
}
}

但是得到错误“信号不是模板”

有办法做到这一点吗?

编辑: 更多信息:我正在尝试做的一个例子,主要是保持 #include我的大多数代码库。

#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

#include "boost/signals2.hpp"
boost::signals2::signal<void()> & ExampleClass::GetSignal()
{
  if (!_signal_pointer)
  {
    _signal_pointer.reset(new boost::signals2::signal<void()>());
  }

  return *_signal_pointer;
}

2 个答案:

答案 0 :(得分:0)

Signals2并非设计为&#34; pimpl&#34; ed。它设计为在您的公共界面中

如果您不想要,请将其包装在您自己的pimpl-wrappers中。但你应该问自己&#34;为什么&#34;第一

答案 1 :(得分:-1)

如果添加template<>

,则可以解决此具体的编译器错误
namespace boost
{
namespace signals2
{
  template<typename T>
  struct signal;

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

因为你可以宣布template的专业化, 你应该自己声明template。然后实际上你 可以写:

namespace boost
{
namespace signals2
{
  template<typename T>
  struct signal;
}
}

由于您只使用前向声明,因此不实施template, 所以没有必要专门研究它。

但它并没有真正帮助你。 是的,如果你没有使用boost::signals2,编译器错误就会消失, 但是如果你使用这样的包含文件,那么在某些地方使用&#34; real&#34; boost::singals2 如果您收到有关signal重新声明的错误,这是因为 真实的boost::signals2::signal采用5-7个模板参数,不记得确切,并且大多数都有一些默认值。

相关问题