下面的简单应用程序演示了编译错误:
我的类声明:MyClass.h
#pragma once
class MyClass
{
friend int MyCalc();
public:
};
类定义:MyClass.cpp
#include "stdafx.h"
#include "MyClass.h"
int MyCalc()
{
return 1 + 2;
}
主要功能:ConsoleApplication1.cpp
#include "stdafx.h"
#include "MyClass.h"
#include <iostream>
int main()
{
std::cout << MyCalc();//"Identifier MyCalc is undefined" in Visual Studio 2019, but not in 2015
return 0;
}
我猜更新后的c++版本使这一点更加严格。因此,我必须在类之外的任何地方添加一个函数声明吗?我声明了一个友元函数,如下所示:
class MyClass
{
friend int MyCalc();
public:
};
int MyCalc();
这是在[namespace.memdef]
中找到的子句,它导致在main()
中找不到名称MyCalc()
,并且只要有C++标准,它就一直是标准C++的一部分。
在命名空间中首次声明的每个名称都是该命名空间的成员。如果非本地类中的友元声明首先声明了一个类或函数,则友元类或函数是最内部封闭命名空间的成员只有在命名空间范围内提供匹配声明后,才能通过简单的名称查找找到好友的名称(在授予友谊的类声明之前或之后(。
Visual C++编译器的旧版本可能没有正确执行此规则,但您的代码出现了错误,而且一直都是错误的,Visual Studio 2019告诉您这一点是正确的。