我正在尝试转发声明升压信号,因此在不使用信号时我不需要包含头文件。
我认为这样可行:
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;
}
答案 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个模板参数,不记得确切,并且大多数都有一些默认值。