C++ 朋友班不工作

C++ 朋友班不工作,c++,class,private,friend,C++,Class,Private,Friend,我得到了典型的。。。在此上下文中是私有的“错误”。 你能告诉我我做错了什么吗? 为了便于阅读,代码被缩短了 类中的SceneEditorWidgetController: (设置对话框,此处使用的变量在标题中定义) 我的类设置控制器 namespace Ui { class SettingsController; } namespace GuiController { class SettingsController : public QDialog {

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

类中的SceneEditorWidgetController: (设置对话框,此处使用的变量在标题中定义)

我的类设置控制器

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类,但它以前就是这样使用的(我可能是瞎的?)


有人能解释一下我做错了什么吗?

对于非限定类名,
friend
声明声明,如果存在这样一个类,则在周围的命名空间中,具有该名称的类就是friend。所以这相当于

friend class GuiController::SceneEditorPluginWidgetController;
但是,您的注释指出该类实际上位于全局名称空间中,而不是
GuiController
,因此这并不意味着它是朋友。您需要正确地对其进行限定:

friend class ::SceneEditorPluginWidgetController;

SceneEditorPluginWidgetController
是否在同一命名空间中,
GuiController
?如果不是,则非限定的
friend
声明引用了另一个类。SceneEditorWidgetController没有命名空间,我如何声明它?您的意思是它在全局命名空间中?将其限定为
::SceneEditorPluginWidgetController
。好的,我知道了。谢谢,有时候你只是瞎了眼!为了防止对其他人有用,我还必须在适当的命名空间中转发声明该类。
friend class ::SceneEditorPluginWidgetController;