我试图使用PIMPL方法隐藏一些蹩脚的模板代码,但我不能给身体类朋友访问手柄类派生类。我从MSVC 9 sp1中收到错误C2248。下面是一些代码复制的错误:PIMPL方法和模板类的朋友
//
// interface.hpp
//
namespace internal{
template<class T>
class specific_body;
}
class interface
{
struct body;
body *pbody_;
interface(body *pbody);
template<class T>
friend class internal::specific_body;
public:
~interface();
interface(const interface &rhs);
bool test() const;
static interface create(bool value);
};
//
// interface.cpp
//
struct interface::body
{
virtual ~body(){}
virtual bool test() const = 0;
virtual interface::body *clone() const = 0;
};
class true_struct {};
class false_struct {};
namespace internal {
template< class T>
class specific_body : public interface::body
{ // C2248
public:
specific_body(){}
virtual bool test() const;
virtual interface::body *clone() const
{
return new specific_body();
}
};
bool specific_body<true_struct>::test() const
{
return true;
}
bool specific_body<false_struct>::test() const
{
return false;
}
} //namespace internal
interface::interface(body *pbody) : pbody_(pbody) {}
interface::interface(const interface &rhs) : pbody_(rhs.pbody_->clone()) {}
interface::~interface() { delete pbody_; }
bool interface::test() const
{
return pbody_->test();
}
interface interface::create(bool value)
{
if (value)
{
return interface(new internal::specific_body<true_struct>());
}
else
{
return interface(new internal::specific_body<false_struct>());
}
}
//
// main.cpp
//
// #include "interface.hpp"
//
int _tmain(int argc, _TCHAR* argv[])
{
interface object(interface::create(true));
if (object.test())
{
// blah
}
else
{
}
return 0;
}
任何帮助,将不胜感激,我试图隐藏的interface
用户interface::body
和specific_body
实现,如果这不是从我的问题很明显。
感谢实例之间的嵌套关系的
specific_body
可以创建一个interface
建议,它不利于虽然 – Queueless 2009-10-16 18:26:58出于兴趣,所有这一切开始工作,如果你删除的命名空间'internal'即只是把'specific_body'在全局命名空间? – Troubadour 2009-10-16 23:00:17