【问题标题】:Friend class not working朋友班不工作
【发布时间】:2015-04-03 03:33:35
【问题描述】:

我收到典型的“...在此上下文中是私有的”错误。 你能告诉我我做错了什么吗? 为了便于阅读,代码被缩短了。

在 SceneEditorWidgetController 类中: (settingsdialog和这里使用的变量在header中定义)

SceneEditorPluginWidgetController::SceneEditorPluginWidgetController()
{
}
void SceneEditorPluginWidgetController::configured()
{
    priorKnowledge_setting = settingsDialog->priorKnowledgeProxyFinder->getSelectedProxyName().toStdString(); //This is the context
}

我的班级 SettingsController.h

namespace Ui {
    class SettingsController;
}
namespace GuiController {
    class SettingsController : public QDialog
    {
        Q_OBJECT
        friend class SceneEditorPluginWidgetController;
    public:
        explicit SettingsController(QWidget *parent = 0);
        ~SettingsController();

    private: //it is private here
        Ui::SettingsController* ui;
        IceProxyFinderBase* priorKnowledgeProxyFinder;
    };
}

我无法修改 IceProxyFinderBase 类,但它以前就是这样使用的(我可能是盲人?)。

谁能解释一下我做错了什么?

【问题讨论】:

  • SceneEditorPluginWidgetController 是否在同一个命名空间GuiController 中?如果不是,那么不合格的friend 声明指的是不同的类。
  • SceneEditorWidgetController 没有命名空间,我该如何声明?
  • 你的意思是它在全局命名空间中?将其限定为::SceneEditorPluginWidgetController
  • 好的,我知道了。谢谢,有时你只是瞎了眼!

标签: c++ class private friend


【解决方案1】:

使用非限定类名,friend 声明声明该名称的类,在周围的命名空间,是朋友,如果这样的类存在。所以这相当于

friend class GuiController::SceneEditorPluginWidgetController;

但是,您的 cmets 说该类实际上是在全局命名空间中,而不是 GuiController,所以这不能使它成为朋友。您需要正确限定它:

friend class ::SceneEditorPluginWidgetController;

【讨论】:

  • 如果它可能对其他人有用,我还必须在适当的命名空间中前向声明该类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
相关资源
最近更新 更多