澄清 类 和此场景中的范围

Clarification on classes and scopes in this scenario

我目前正在使用 JUCE Framework 创建一个音频 VST 插件来掌握和学习,但只想澄清一些与 classes 相关的基本内容。

在我的头文件中,我有一个 class EQPLUGProcessor 并且在那个 class 里面我调用 static juce::AudioProcessorValueTreeState::ParameterLayout createParameterLayout();

当我在 .cpp 中调用函数 createParameterLayout() 时,我必须编写 juce::AudioProcessorValueTreeState::ParameterLayout EQPLUGAudioProcessor::createParameterLayout(){}

我的问题是,为什么我必须在函数所在的实际范围 (EQPLUGAudioProcessor) 之前包含 juce::AudioProcessorValueTreeState::ParameterLayout?当然,我应该告诉编译器查看 EQPLUGAudioProcessor,仅此而已?

我知道 EQPLUGAudioProcessor 是 class,它都在里面,但似乎仍然无法理解何时、何地以及为什么我需要澄清 class该函数来自 again in the .cpp?

如果这需要澄清,请告诉我。

不必指定封闭的命名空间或 class 仅在同一命名空间或 class:

class store {

    class give_me {

    // ...

    };

    static give_me something_cool();
};

这里,something_cool()的声明只需要引用give_me,而不是store::give_me。这是因为此声明出现在其 class.

的声明 中

现在这个class已经声明了,是时候定义它的class方法了,所有的东西都必须拼写出来:

store::give_me store::something_cool()
{
      // ...
}

如果 class 方法 return 编辑了 void 而不是你仍然必须写这样的东西:

void store::something_cool()
{
      // ...
}

您已经明白您不能只编写 void something_cool() 并定义此 class 方法。这只会用这个名字定义一些不相关的函数。

你必须写 store::something_cool 因为这个定义不再出现在 store 范围内。

嗯,同样的事情不仅适用于 class 方法,也适用于内部 classes(以及在某些封闭范围内声明的其他类型的符号)。由于 give_me 不是在全局范围内声明的 class,它是一个内部 class,当在全局范围内时,您必须将其引用为 store::give_me.

这就是 C++ 的工作原理。还有各种复杂的规则定义范围的开始和结束位置,关于 C++ 的语法,这与此无关。在某些情况下,可以利用这些范围规则并通过使用带有尾随 return 类型的 auto 声明来避免显式范围引用;但是如何做到这一点将是另一个问题。