3

私は次のコードを持っています:

ファイル: Foo.h

class Foo {
    friend void Bar();
};

ファイル: Foo.cpp

void Bar() {};

ファイル Test.cpp

#include "Foo.h"

int main(void) {
    Bar();
    return 0;
}

VS2008 は、エラーや警告なしでこれをコンパイルします。G++ 4.3.4 レポート:

test.cpp: In function ‘int main()’:
test.cpp:8: error: ‘Bar’ was not declared in this scope

なんで?

4

3 に答える 3

2

この質問は「未回答」セクションで見つかりましたが、前の不正解に対するコメントは正解です。したがって、ここにそのコンテンツを含むコミュニティ wiki の応答があります。

概要: GCC は適切なコードを拒否しているようです。

クラス内でフレンド関数が (宣言されているだけでなく) 定義されている場合は、11.4.5 でカバーされています (「クラスが非ローカル クラスである場合に限り、クラスのフレンド宣言で関数を定義できます。関数名は、は修飾されておらず、関数には名前空間スコープがあります」-あなたの例はこれらの要件を満たしています)。その標準では、クラス内でのフレンド関数の宣言 (「プロトタイプ」) が許可されていると思います。私を悩ませているのは、g ++が生成しているエラーです。– liori 11 月 22 日 20:35

また、11.4.3: 「フレンド宣言で最初に宣言された関数には、外部リンケージ (3.5) があります。それ以外の場合、関数は以前のリンケージ (7.1.1) を保持します。」これで契約が成立すると思います。– Potatoswatter 0 秒前 [このコメントを削除]

于 2009-12-23T07:39:23.853 に答える
1

宣言はプロトタイプとしてカウントされfriendません。別のプロトタイプも必要です。

// File: Foo.h

void Bar();

class Foo {
    friend void Bar();
};
于 2009-11-22T20:02:18.027 に答える
-3

あなたたちは標準の知識を持って揺れ動きます、それは本当です。しかし、標準は標準であり、標準の実装はまったく別のものです。MSVCのように、標準に準拠しているように見えるコンパイラを常に1つだけ使用していると思います。他にもたくさんのコンパイラがありますが。

私とC/C ++での5年間の謙虚な経験にとって、これはTest.cppがBarを認識しないことは明らかです。これは、Barの宣言がないFoo.hだけが含まれているためです。

彼の答えが尋ねられた質問を解決するので、私はジョン・クーゲルマンに+1を与えました。そして、それは標準の知識でスパムしません。

于 2009-12-23T09:00:48.663 に答える