2013-04-26 61 views
1

我有以下几点:不能宣布的朋友的typedef

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()吗?

谢谢!

+0

使CTest :: SaveModelToFile()成为SP <>的朋友。 – 2013-04-26 03:37:43

+0

SP <>是一个普通的智能指针类,所以我不能使CTest :: SaveModelToFile()成为它的朋友。 – AvatarBlue 2013-04-26 03:41:26

+0

我的答案是否适合你?如果没有,请帮助我改进它。 – TemplateRex 2013-05-01 09:22:07

回答

0

因为ModelPtr->产生了CVPatModel*,所以您不必乱搞智能指针类的内部。因为您的课CTest不知道约CVPatModelprotected成员Save(),您必须申报CTest::SaveModelToFile a friendCVPatModel

#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添加更多测试功能,那么您最好在CVPatModel内部放置friend class CTest