【问题标题】:my production code stopped compiling after moving to visual studio 2019迁移到 Visual Studio 2019 后,我的生产代码停止编译
【发布时间】:2021-06-11 19:30:00
【问题描述】:

以下简单应用程序演示了编译错误:

我的班级声明: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();

【问题讨论】:

  • C++ 已经有很长一段时间了。
  • Visual Studio 的 C++ 编译器存在错误,已在 2019 年修复。
  • 尝试关闭预编译头文件。小型程序不需要它们。
  • 当前 C/C++ 设置 = "不使用预编译头文件"

标签: c++ visual-studio-2015 visual-studio-2019 friend


【解决方案1】:

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

在命名空间中首先声明的每个名称都是该命名空间的成员。如果非本地类中的友元声明首先声明了一个类或函数,则友元类或函数是最内层封闭命名空间的成员。 在该命名空间范围内提供匹配声明之前,无法通过简单的名称查找找到朋友的名字(在授予友谊的类声明之前或之后)。

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

【讨论】:

  • 如果有人在 C++98 中检查此规则,我将不胜感激。
  • 相同的措辞在 C++98 中(第 7.3.1.2 节,第 3 段)。
猜你喜欢
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
  • 2023-04-07
  • 2019-06-07
  • 2021-03-20
  • 1970-01-01
相关资源
最近更新 更多