2013-04-26 25 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