【问题标题】:Can C++ method names be qualified by the class name, in the header?C++ 方法名称可以在标头中由类名称限定吗?
【发布时间】:2010-10-15 21:14:58
【问题描述】:

简单的问题,这是有效的 C++:

class Foo
{
    void Foo::doSomething();
};

问题的重点:在方法名之前重复使用类名和双冒号是否有效类声明中?

我在使用 g++ 4.2.3 编译执行此操作的代码时遇到问题。在深入研究和更改代码之前,我希望看到对此处描述语法的内容的引用。或者降级编译器;这确实使用 g++ 3.3.6 构建。

我得到的错误是(大致):

Foo.h:3: error: extra qualification ‘Foo::’ on member ‘doSomething’

我用谷歌搜索过,但想不出什么。我没有标准,即使我这样做了,我也可能需要很长时间才能找到任何权威的东西。我不是 C++ 语言律师。

【问题讨论】:

  • Visual Studio (2008) 接受“Foo::”
  • 是的,我知道...但是我正在尝试使用 g++ 构建代码,而且它们接受和不接受的内容通常不同。或者,在我看来,VC 似乎可以接受任何东西,而 g++ 可能很挑剔。 :)
  • 我会说 Foo:: 充其量是不必要的,最坏的情况是无效的。因此,在我看来,您完全有理由删除它。

标签: c++ syntax declaration classname


【解决方案1】:

我查看了标准,第 9.2 节将是相关部分。我对 BNF 不是很好,但我在 BNF 中没有看到任何关于班级成员的信息表明这是允许的。该标识符在 BNF 中甚至被命名为“unqualified-id”。

G++ 在 4.1 版本中改变了这种行为,显然很多其他编译器都接受了这一点,但我从未见过这种风格被使用过,我也不知道为什么有人会这样做。由于它似乎不会在各种编译器上触发错误,因此这种风格可能有一些历史原因,但据我所知,它确实是无效的。

我通过 Google 找到的唯一好的参考是 this page,它只是试图解释 G++ 4.1 中的一些变化。

【讨论】:

  • 谢谢,这是一个非常有帮助的答案。我已经投了赞成票。在接受之前我会坚持一段时间,希望能帮助人们有足够的动力去做更多的标准搜索。 :)
  • 我也不知道为什么有人会想要使用这种语法,但我知道它是如何神奇地出现的。有点。从 cpp 复制/粘贴到头文件以内联函数,然后就可以了。
  • 是的,我怀疑也是这样。
【解决方案2】:

和 Dan 一样,我查看了标准,但没有确定的结果。我用Comeau's on-line compiler(被认为是世界上最符合标准的)尝试了你的代码并得到:

第 3 行:错误:限定名不是 在成员声明中允许

如果您有兴趣进一步了解这一点,我建议您在 comp.lang.c++.moderated 新闻组上发帖提问,因为那里的 C++ 语言律师比这里多得多。

【讨论】:

  • 谢谢!我对此投了赞成票,但现在接受了丹的回答,我认为这是有道理且公平的。
  • 我还使用 Comeau 编译器进行标准检查(和错误报告,因为它更具表现力)。这对任何人都是一个很好的建议:用 Comeau 检查代码 sn-ps(在线或购买,因为它相当便宜)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
相关资源
最近更新 更多