4

簡単な質問ですが、これは有効な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++言語の弁護士ではありません。

4

2 に答える 2

18

私は標準を見てみましたが、セクション9.2が関連する部分です。私は BNF が得意ではありませんが、クラス メンバーの BNF には、これが許可されていることを示すものは何もありませんでした。識別子は、BNF で「unqualified-id」という名前さえ付けられます。

G++ はバージョン 4.1 で動作を変更し、他の多くのコンパイラがこれを受け入れたようですが、このスタイルが使用されているのを見たことがなく、なぜ誰かがそれを行うのかわかりません。さまざまなコンパイラでエラーが発生しないように見えるため、このスタイルには歴史的な理由がある可能性がありますが、私が知る限り、実際には有効ではありません。

私が Google で見つけた唯一の参考文献は、このページでした。このページは、G++ 4.1 の変更点のいくつかを説明しようとしています。

于 2009-03-27T07:46:15.977 に答える
5

ダンのように、私は決定的な結果なしにスタンダードを見ました。あなたのコードをComeau のオンライン コンパイラ(世界で最も標準に準拠していると考えられている) で試したところ、次の結果が得られました。

3 行目: エラー: 修飾名はメンバー宣言では許可されていません

これをさらに進めることに興味がある場合は、comp.lang.c++.moderatedニュースグループに質問を投稿することをお勧めします。そこには、ここよりもはるかに多くの C++ 言語弁護士がいるからです。

于 2009-03-27T09:12:05.243 に答える