我正在尝试将 aboost::scoped_ptr
与仅在包含类的 cpp 文件中可见的实现类一起使用。包含类有一个明确定义的析构函数(不是内联的),但我的编译器(Borland C++ 5.6.4)无法编译。
如果我boost::shared_ptr
改用,相同的示例将按预期编译和运行。
我究竟做错了什么?
编辑:很抱歉忘记在这里显示源代码、编译器错误和(预期的)输出:
源代码
文件check_shared.cpp
:
// shortened.
#include "SmartPtrTest.h"
void check_shared()
{
Containing t;
}
文件SmartPtrTest.h
:
#include <boost/noncopyable.hpp>
#include <boost/smart_ptr.hpp>
class Impl;
#define smart_ptr boost::scoped_ptr
class Containing: private boost::noncopyable
{
public:
Containing();
~Containing();
private:
smart_ptr<Impl> impl;
};
文件SmartPtrTest.cpp
:
#include "SmartPtrTest.h"
#include <iostream>
using namespace std;
class Impl {
public:
Impl() {
cout << "ctr Impl" << endl;
}
~Impl() {
cout << "dtr Impl" << endl;
}
};
Containing::Containing(): impl(new Impl)
{
cout << "ctr Containing" << endl;
}
Containing::~Containing()
{
cout << "dtr Containing" << endl;
}
编译器错误
...有点像undefined structure 'Impl'
(它是德语:Undefinierte Struktur 'Impl')。编译文件时,编译器在此函数的文件中check_shared.cpp
停止:boost/checked_delete.hpp
typedef
template<class T> inline void checked_delete(T * x)
{
// intentionally complex - simplification causes regressions
typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
(void) sizeof(type_must_be_complete);
delete x;
}
输出(预期)
我在使用时得到的这个输出boost::share_ptr
,表明 ctr 和 dtr 是按预期调用的。
ctr Impl
ctr Containing
dtr Containing
dtr Impl