3

結論: はい。ただし、VC++ 11.0.60610.01 の時点では、Intellisense は気に入らないでしょう。

私は通常、友情を使用しませんが、今回は本当に必要で、Visual Studio 2012 で動作させることができません。インテリセンスのバグである可能性があります (コードは正常にコンパイルされます)。私のコードに何か問題があった場合。これは問題を再現します:

class B;

class A
{
public:
    int fun(B b);
};

class B
{
public:
    friend int A::fun(B b);
    B() : member(0) {}
private:
    int member;
};

int A::fun(B b)
{
    return b.member; // Error: B::member is inaccessible.
}

int main()
{
    A a;
    B b;
    std::cout << a.fun(b);
    return 0;
}

上記のコードはコードパッドでは正常にコンパイルされますが、VS2012 では Intellisense エラーが返されます。私が間違っていることはありますか?

4

1 に答える 1

2

これは、クラスにコンストラクターがないためだと思います。この場合、IntelliSense に追いついたようです (friend 節を に変更しても文句を言わないため、これは実際にはバグである可能性がありますfriend class A;)。

IntelliSense: メンバー "B::member" (18 行目で宣言) にアクセスできません

実際のエラー (コンパイラはデフォルトで警告をエラーとして扱います) は次のとおりです。

エラー C4700: 初期化されていないローカル変数 'b' が使用されました

これが私が呼び出した方法です:

int _tmain(int argc, _TCHAR* argv[])
{
    A a;
    B b;
    std::cout << a.fun(b);
    return 0;
}

初期化されたBものに独自のデフォルトコンストラクターを指定すると、ビルドされます (IntelliSense は文句を言いません) 。member

class B
{
public:
    B() : member(0) {}
private:
    int member;
    friend int A::fun(B b);
};
于 2013-10-17T02:20:35.210 に答える