您不必弄乱智能指针类的内部结构,因为会ModelPtr->生成一个CVPatModel*. 因为你的类CTest不知道CVPatModel's 的protected成员Save(),你必须声明CTest::SaveModelToFile一个friendof CVPatModel。
#include <memory>
#include <iostream>
template<typename T>
using SP = std::shared_ptr<T>;
class CVPatModel;
typedef SP<CVPatModel> VModel;
class CTest
{
public:
void SaveModelToFile( VModel ModelPtr, const char* szFileName );
};
class CVPatModel
{
public :
friend void CTest::SaveModelToFile( VModel, const char*);
protected :
virtual void Save( const char* szFileName ) { std::cout << "saving to file \"" << szFileName << "\" succeeded!\n"; };
};
void CTest::SaveModelToFile( VModel ModelPtr, const char* szFileName )
{
ModelPtr->Save(szFileName);
}
int main()
{
VModel vm = std::make_shared<CVPatModel>();
CTest ct;
ct.SaveModelToFile(vm, "bla");
}
在Ideone上输出。
如果您开始向 . 添加更多测试功能CTest,不妨friend class CTest在CVPatModel.