结论:是的,但智能感知不会像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错误。有什么我做错了吗?
答案 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);
};