无法为Typedef声明好友

时间:2013-04-26 03:26:36

标签: c++ typedef friend

我有以下内容:

typedef SP<CVPatModel *> VModel;


class VLIB_API CVPatModel
{
public :

    friend VModel;

protected :

    virtual void Save( char* szFileName );

}


void CTest::SaveModelToFile( VModel ModelPtr, char* szFileName )
{

    ModelPtr->Save(szFileName);
}

我将得到“无法访问在类'CVPatModel'中声明的受保护成员。”

我有没有通过VModel访问Save()?

谢谢!

1 个答案:

答案 0 :(得分:0)

您不必乱用智能指针类的内部,因为ModelPtr->会产生CVPatModel*。由于您的班级CTest不了解CVPatModel的{​​{1}}成员protected,您必须声明Save() CTest::SaveModelToFile friend }}。

CVPatModel

Ideone上的输出。

如果您开始向#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"); } 添加更多测试功能,您也可以在CTest内添加friend class CTest