我的生产代码在移动到 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 年告诉您这一点是正确的。
下面的简单应用演示了编译错误:
我的 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 年告诉您这一点是正确的。