请考虑下面的代码。
模板参数是必须提供函数的处理程序类bar()
。
我正在使用 Pimpl 习惯用法来隐藏Foo
. 在拥有模板参数之前,构造函数定义已经存在foo.cpp
并且一切都很好。
///////////
// foo.h
///////////
class Foo
{
public:
template <class Handler>
Foo(Handler& handler);
void someFunction();
private:
/** Private implementation details. */
struct Impl;
const std::unique_ptr<Impl> m_impl;
};
template <class Handler>
Foo::Foo(Handler& handler) : m_impl{new Impl{handler}}
{
}
///////////
// foo.cpp
///////////
#include "foo.h"
/** Encapsulates the private implementation details of Foo. */
struct Foo::Impl
{
public:
Impl(Handler& handler) : m_handler(handler)
{
}
void someOtherFunction()
{
m_handler->bar();
}
private:
Handler& m_handler;
friend class Foo;
};
void Foo::someFunction()
{
m_impl->someOtherFunction();
}
引入模板参数后,我必须将构造函数放入foo.h
,这会导致以下编译器错误:
Allocation of incomplete type 'Foo::Impl'
.
我理解我收到错误的原因,但我想不出解决它的方法,仍然使用 Pimpl 成语。
任何人都可以帮忙吗?