c++ - Visual Studio 2019 中的编译错误 C2760 但不是 Visual Studio Code
问题描述
使用最新版本的 Visual Studio 2019 和 Visual Studio。在这两个中,我都试图使用这个仅标题的类来显示一个向量:
#pragma once
#include <cstring>
#include <iterator>
#include <vector>
// Header-only helper class for using strings
class stringHelper
{
public:
// Constructor / destructor
stringHelper() {}
~stringHelper() {}
template <class T>
void PrintVector(std::vector<T> input, const char cSeparator = ' ', bool bNewLine = false)
{
// Output an array (std::vector) to the console eg. {1,11,21} => 1 11 21.
// Example usage: stringHelper::PrintVector<int>(vecOfInts);
if (input.size() > 0)
{
for (std::vector<T>::iterator it = input.begin(); it != input.end();)
{
std::cout << *it;
if (++it != input.end())
std::cout << cSeparator;
}
if (bNewLine)
std::cout << std::endl;
}
}
};
Visual Studio Code 已配置为使用cl.exe
Visual Studio 2019 中的编译器,如下所示:
{
// Use MSVC cl.exe (eg. Visual Studio 2019) on Windows
"type": "shell",
"label": "cl.exe: Build active file (DEBUG)",
"command": "cl.exe",
"args": [
"/std:c++17",
"/Zi",
"/EHsc",
"/Fe:",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"${file}"
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$msCompile"
],
"group": {
"kind": "build",
"isDefault": true
}
}
一个简单的测试程序可能是:
#include <vector>
#include "stringHelper.h"
int main()
{
// Create and print out a vector
stringHelper helper;
std::vector<int> vec = {1, 2, 17};
helper.PrintVector<int>(vec); // Expecting: 1 2 17
return 0;
}
在 Visual Studio Code 中,程序编译并产生正确的结果。Visual Studio 项目配置为使用 C++17(我也尝试过 C++14)。当我在 Visual Studio 2019 Professional 中编译时,C2760
会生成多个编译错误:
Error C2760 syntax error: unexpected token 'identifier', expected ';'
当我在 中选择这一行时Error List
,标记it
会突出显示。
将内部循环更改PrintVector
为以下内容,这是微妙的不同,而不是我需要的。现在一切都在 Visual Studio Code 和 2019 中编译并正常工作:
for (auto a : input)
{
std::cout << a << cSeparator;
}
Microsoft 对 C2760的帮助似乎不适用。这是编译器还是 VS 2019 错误?为什么这在 Visual Studio 2019 中失败,但在 Visual Studio Code 中没有?
解决方案
此问题已报告给 Microsoft,Microsoft 做出了回应(在 48 小时内!)并解释了根本问题。这不是编译器错误,而是与使用模板时的类型推导有关。在此处阅读完整的讨论。
其中一条评论提供了指向此StackOverflow 答案的有用链接,其中包含类似的详细信息。
执行摘要
std::vector<T>::iterator
是一个从属名称,它会产生歧义问题- 通过指定它
std::vector<T>::iterator
是一种类型或用途来解决auto
(下面的代码示例) cl.exe
使用/permissive-选项时检测到问题。这是为或启用的,Visual Studio 2019
但不是(默认情况下)。Visual Studio Code
Visual Studio 2019 Developer Command Prompt
要指定为类型:
typename std::vector<T>::iterator it = input.begin();
for (; it != input.end();)
要使用auto
:
for (auto it = input.begin(); it != input.end();)
两种解决方案都已经过测试并解决了编译问题。
推荐阅读
- python - 有没有办法使用代码将字符串粘贴到用户输入中?
- azure-devops - 在不使用群集的情况下将 Azure Blob 存储装载到 Azure Databricks
- stata - 访问 Stata 命令和函数的源代码
- python - 计算列表中每三个连续点的叉积并检查所有叉积是否具有相同的符号
- go - 创建/获取自定义 kubernetes 资源
- sql - 带有 for 循环 PL/SQL 的动态 sql
- javascript - 无法在反应JS中向下滚动屏幕
- javascript - React 警告:在现有状态转换期间无法更新(例如在 `render` 中)
- tensorflow - 使用带有 DQN 算法的张量板
- postgresql - 用docker安装的postgresql的密码会自动更改吗?