don't compile with incomplete types
git-svn-id: svn://svn.code.sf.net/p/loki-lib/code/trunk@579 7ec92016-0320-0410-acc4-a06ded1c099a
This commit is contained in:
parent
d1fa26e239
commit
a28d4d6ddd
1 changed files with 22 additions and 16 deletions
|
@ -31,22 +31,12 @@ namespace Loki
|
||||||
template<class T>
|
template<class T>
|
||||||
struct ConstPropPtr
|
struct ConstPropPtr
|
||||||
{
|
{
|
||||||
explicit ConstPropPtr(T* p) : ptr_(p){}
|
explicit ConstPropPtr(T* p) : ptr_(p) {}
|
||||||
~ConstPropPtr()
|
~ConstPropPtr() { delete ptr_; ptr_ = 0; }
|
||||||
{
|
T* operator->() { return ptr_; }
|
||||||
// If compilation brakes here make sure
|
T& operator*() { return *ptr_; }
|
||||||
// you've declared the destructor of the class
|
const T* operator->() const { return ptr_; }
|
||||||
// hosting the pimpl, also don't inline the
|
const T& operator*() const { return *ptr_; }
|
||||||
// destructor.
|
|
||||||
typedef char T_must_be_defined[sizeof(T) ? 1 : -1 ];
|
|
||||||
delete ptr_;
|
|
||||||
ptr_ = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
T* operator->() {return ptr_;}
|
|
||||||
T& operator*() {return *ptr_;}
|
|
||||||
const T* operator->() const {return ptr_;}
|
|
||||||
const T& operator*() const {return *ptr_;}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ConstPropPtr();
|
ConstPropPtr();
|
||||||
|
@ -74,6 +64,19 @@ namespace Loki
|
||||||
Pimpl() : ptr_(new T)
|
Pimpl() : ptr_(new T)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
~Pimpl()
|
||||||
|
{
|
||||||
|
// Don't compile with incomplete type
|
||||||
|
//
|
||||||
|
// If compilation brakes here make sure
|
||||||
|
// the compiler does not auto-generate the
|
||||||
|
// destructor of the class hosting the pimpl:
|
||||||
|
// - implement the destructor of the class
|
||||||
|
// - don't inline the destructor
|
||||||
|
typedef char T_must_be_defined[sizeof(T) ? 1 : -1 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
T* operator->()
|
T* operator->()
|
||||||
{
|
{
|
||||||
return ptr_.operator->();
|
return ptr_.operator->();
|
||||||
|
@ -165,6 +168,9 @@ namespace Loki
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// $Log$
|
// $Log$
|
||||||
|
// Revision 1.17 2006/03/02 09:55:37 syntheticpp
|
||||||
|
// don't compile with incomplete types
|
||||||
|
//
|
||||||
// Revision 1.16 2006/03/01 15:20:19 syntheticpp
|
// Revision 1.16 2006/03/01 15:20:19 syntheticpp
|
||||||
// add documenation how to avoid the -deletion of pointer to incomplete type- error
|
// add documenation how to avoid the -deletion of pointer to incomplete type- error
|
||||||
//
|
//
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue