我的生产代码在移动到 visual studio 2019 后停止编译

my production code stopped compiling after moving to visual studio 2019

下面的简单应用演示了编译错误:

我的 class 声明:MyClass.h

#pragma once
class MyClass
{
   friend int MyCalc();
public:
};

class定义: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 声明友元函数的任何地方添加函数声明,如下所示:

class MyClass
{
   friend int MyCalc();
public:
};
int MyCalc();

这是在 [namespace.memdef] 中找到的子句,它导致在 main() 中找不到名称 MyCalc(),它一直是标准 C++ 的一部分因为已经有了 C++ 标准。

Every name first declared in a namespace is a member of that namespace. If a friend declaration in a non-local class first declares a class or function the friend class or function is a member of the innermost enclosing namespace. The name of the friend is not found by simple name lookup until a matching declaration is provided in that namespace scope (either before or after the class declaration granting friendship).

旧版本的 Visual C++ 编译器可能未正确执行此规则,但您的代码有误并且一直如此,Visual Studio 2019 年告诉您这一点是正确的。