3

次のコードを書きました。

#include<iostream>
using namespace std;

class foo {
private:    
    int i;
public:
    foo(): i(1) { }
    friend int func1(int i) {
        return 0;
    }
    friend int func2(foo &f) {
        return f.i;
    }
};

int main()
{
    foo f;
    cout << func2(f) << endl;
    cout << func1(1) << endl;
    return 0;
}

ただし、次のエラーでコンパイルできません。

ss.cpp: In function ‘int main()’:
ss.cpp:28:17: error: ‘func1’ was not declared in this scope

この行を削除したとき:

cout << func1(1) << endl;

正常にコンパイルされました

クラスでフレンド関数を定義し、それをグローバル名前空間で呼び出したい場合、それはクラスと何らかの関係を持っている必要がありますか? もしそうなら、ルールの詳細は何ですか?

私のコンパイラは g++-4.7.2 です

4

1 に答える 1

5

あなたは自分でルールを見つけたようです。見つけるには、関数にクラスタイプのパラメーターが必要です。

ウィキペディアの引数依存のルックアップを参照してください。

于 2013-01-05T09:47:34.920 に答える