我正在尝试转发声明boost信号,所以当信号不被使用时,我不需要包括头文件。
我原以为这会奏效:
namespace boost
{
namespace signals2
{
class signal<void()>;
}
}但是会得到错误"signal is not a template“
有没有办法做到这一点?
编辑:更多信息:我正在尝试做的一个示例,主要是将#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;
}发布于 2015-11-14 20:27:33
如果添加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,编译器错误就会消失,但是如果你使用这样的包含文件,在包含“真正的”boost::singals2的地方,你会得到关于signal重新声明的错误,这是因为真正的boost::signals2::signal采用了5-7个模板参数,不准确地记住了,并且对大多数模板参数有一些默认值。
发布于 2015-11-14 21:44:20
Signals2不是被设计成“pimpl”的。它被设计成出现在你的公共界面中。
如果您不想这样,可以将其包装在您自己的pimpl-wrappers中。但你应该先问问自己“为什么”。
https://stackoverflow.com/questions/33705382
复制相似问题