我可以在Visual Studio 2012中将方法声明为朋友吗?

时间:2013-10-17 02:05:37

标签: c++ visual-studio-2012

结论:是的,但智能感知不会像VC ++ 11.0.60610.01那样喜欢

我一般不使用友谊,但这次我真的需要它,我无法让它在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;
}

以上代码compiles fine on codepad但在VS2012中返回Intellisense错误。有什么我做错了吗?

1 个答案:

答案 0 :(得分:2)

我认为这是因为你的课上没有构造函数。在这种情况下,它似乎赶上了智能感知(这可能确实是一个错误,因为如果你将朋友条款改为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);
};