2009-03-27 15 views
4

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

+0

Visual Studio(2008)は "Foo ::"を受け入れます –

+0

ええ、私は知っています...しかし、g ++を使ってコードを構築しようとしています。または、私の視点から見ると、VCは何かを受け入れるようですが、g ++は厄介なことがあります。 :) – unwind

+0

私はFoo ::は最高で不必要で最悪の場合有効ではないと言っています。したがって、私の意見では、あなたは完全にそれを削除することが正当です。 – markh44

答えて

18

私は標準を見て、セクション9.2が関連する部分になります。私はBNFにはそれほど素晴らしいとは言えませんが、BNFではこれが許可されたことを示すクラスメンバーは何も見つかりませんでした。識別子は、BNFで「unqualified-id」と命名さえさえあります。

G ++はバージョン4.1の動作を変更しました。他の多くのコンパイラがこれを受け入れたようですが、このスタイルは使用されていませんでした。非常に幅広い種類のコンパイラでエラーを引き起こすようには見えないので、このスタイルには歴史的な理由があるかもしれませんが、本当に有効ではないと私が言う限り、

私がGoogleで見つけた唯一の参考資料は、this pageで、G ++ 4.1の変更の一部を説明しようとしています。

+0

ありがとう、これは非常に有用な答えです。私はそれを投票した。私は受け入れる前にしばらく待って、人々がより多くの標準検索をするのに十分な動機を感じるのを助けることを望んでいます。 :) – unwind

+0

私は誰もこの構文を使用したいと思うのはわかりませんが、私はそれが魔法のように表示される方法を知っています。並べ替えcppからヘッダファイルにコピー/ペーストして関数をインライン展開します。 –

+0

はい、それは私が起こったと思われるものです。 – unwind

4

ダンと同様に、私は決定的な結果を出さずにスタンダードを見ました。私は(世界で最も標準に準拠し見なさ)となったComeau's on-line compilerであなたのコードを試してみました:

line 3: error: qualified name is not allowed in member declaration

あなたはこれをさらに取るに興味がある場合は、より多くのCがあるので、私は、comp.lang.c++.moderatedニュースグループに質問を投稿示唆++言語弁護士がここにいるよりも。

+0

ありがとう!私はこれを投票しましたが、ダンの答えを受け入れました。私はそれが理にかなって公正だと思っています。 – unwind

+0

私は標準的なチェックのためにComeauコンパイラも使用しています(より表現力豊かなので、エラー報告もあります)。それは誰にでも良いアドバイスです:Comeauのコードスニペットをチェックしてください(オンラインでも購入してもかまいません) –

関連する問題