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

C++ 我可以在Visual Studio 2012中将方法声明为好友吗?,c++,visual-studio-2012,C++,Visual Studio 2012,结论:是的,但从VC++11.0.60610.01开始,Intellisense不会喜欢它 我通常不使用友谊,但这次我真的需要它,而且我无法在VisualStudio2012中使用它。我认为这可能是一个intellisense bug(代码编译得很好),但我只是想看看我的代码是否有问题。这再现了问题: class B; class A { public: int fun(B b); }; class B { public: friend int A::fun(B b);

结论:是的,但从VC++11.0.60610.01开始,Intellisense不会喜欢它

我通常不使用友谊,但这次我真的需要它,而且我无法在VisualStudio2012中使用它。我认为这可能是一个intellisense bug(代码编译得很好),但我只是想看看我的代码是否有问题。这再现了问题:

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;
}
B类;
甲级
{
公众:
int fun(B);
};
B类
{
公众:
朋友A::乐趣(B);
B():成员(0){}
私人:
国际会员;
};
INTA::乐趣(B)
{
返回b.member;//错误:b::member不可访问。
}
int main()
{
A A;
B B;

std::cout我认为这是因为您的类中没有构造函数。在这种情况下,它似乎被IntelliSense赶上了(这可能确实是一个bug,因为如果您将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;
}

你真的是从编译器那里得到这个错误吗?还是从intellisense那里得到的?(例如,当你把鼠标移到红色的曲线上时)事实上,这个问题与IDE Visual Studio 2012有很大的关系。当然,这也与C++语言有关,这就是他为什么用两种语言来标记它的原因。@本杰明兰德利我更新了OP来澄清错误。编译器没有报告什么(例如,我不知道Intellisense是否报告警告)@KenWhite Intellisense是IDE的一部分。如果我提到VC++编译器,我会从其他天才那里得到一条评论,声称我应该学习Intellisense和编译器之间的区别。这是一个不可能的情况,我尽了最大努力。@ausairman:是的,我们在这里不这么做。:-)有非常具体的(和强制的)关于SO的行为准则。正如我所说的,不用担心。:-)请在OP中查看我的更新代码;我仍然收到错误。我那里的代码是否给了您intellisense错误?是的,它仍然用红色的波浪下划线突出显示该行,但我在构建输出中没有收到错误。看起来intellisense不是智能enough处理会员功能友谊。仅供参考,我的VS 2012版本是11.0.50727.1 RTMRELOK谢谢,我使用的是11.0.6x。我会在MS论坛上发牢骚,看看他们怎么说-我一直在考虑尝试VS2013。谢谢!
class B
{
public:
    B() : member(0) {}
private:
    int member;
    friend int A::fun(B b);
};