【问题标题】:c++ scoping weirdness - Why do inner-type parameters of member functions do not need scoping?c++ 范围怪异 - 为什么成员函数的内部类型参数不需要范围?
【发布时间】:2010-11-01 17:48:05
【问题描述】:

假设我们得到了这个带有内部结构的类。

class Some {
   public:
    struct Crap{};
    Crap Process(Crap& c);
}


Some::Crap Some::Process(Crap& crap) {   Crap moreCrap = ..  }

对我来说,“Process”中的返回类型 (Some::Crap) 是有范围的。

对我来说,“流程”主体内不需要范围界定是有道理的。

我不明白为什么 Process (Crap& crap) 的内部结构参数 不需要 需要范围。

有人对此有任何见解吗? 谢谢

【问题讨论】:

  • 这不会编译,即使您在类定义后添加; 并使函数体合法。原始函数是该类的成员吗?

标签: c++ member scoping


【解决方案1】:

事实上,参数类型确实需要被限定(除非你的例子不正确并且你打算让Process成为Some的成员函数)。

【讨论】:

  • 是的,我希望 Process 成为 Some 的成员。固定的。对不起
【解决方案2】:

假设如下sn-p:

class Some
{
public:
    struct Crap{};
    Crap Process(Crap&);
};

Some::Crap Some::Process(Crap& crap) { ... }

基本上,Crap 不需要在函数参数列表和函数体中限定范围,原因与您不需要 this-> 来访问数据成员和成员函数的原因相同:它是隐式的,因为它位于相同的范围内。

需要返回类型的原因仅仅是因为解析器在方法名称之前遇到返回类型,并且不能(不需要?)在那个时候推断范围。

【讨论】:

  • 所以你的意思是解析器实现细节泄露到语言语法中?
  • 我不会说它是“泄露的”,但解析器和语言语法显然是齐头并进的。在设计语法时,您要确保可以构造一个明确的、可实现的解析器。
【解决方案3】:

问题标题为“成员函数”,但您的示例不包含成员函数。假设您的意思是Some::Process 而不仅仅是Process

成员函数定义的类作用域始于(,而不是{。我认为推理正是为了使此类内容可以更短。

【讨论】:

    猜你喜欢
    • 2011-07-03
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 2016-04-26
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多