我試圖使用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