繁体   English   中英

无法为Typedef声明朋友

[英]Can't Declare friend for 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()?

谢谢!

您不必弄乱智能指针类的内部,因为ModelPtr->生成CVPatModel* 因为你的类CTest不知道CVPatModelprotected成员Save()您必须声明CTest::SaveModelToFile一个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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM