【问题标题】:Can't Declare friend for Typedef无法为 Typedef 声明朋友
【发布时间】:2013-04-26 03:26:36
【问题描述】:

我有以下:

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

谢谢!

【问题讨论】:

  • 让 CTest::SaveModelToFile() 成为 SP. 的朋友
  • SP 是一个通用的智能指针类,所以我不能让 CTest::SaveModelToFile() 成为它的朋友。
  • 我的回答对你有用吗?如果没有,请帮助我改进它。

标签: c++ typedef friend


【解决方案1】:

您不必弄乱智能指针类的内部结构,因为ModelPtr-&gt; 会产生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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多