首页 > 解决方案 > 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.exeVisual 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 中没有?

标签: c++visual-studio-codevisual-studio-2019

解决方案


此问题已报告给 Microsoft,Microsoft 做出了回应(在 48 小时内!)并解释了根本问题。这不是编译器错误,而是与使用模板时的类型推导有关。在此处阅读完整的讨论

其中一条评论提供了指向此StackOverflow 答案的有用链接,其中包含类似的详细信息。

执行摘要

  • std::vector<T>::iterator是一个从属名称,它会产生歧义问题
  • 通过指定它std::vector<T>::iterator是一种类型或用途来解决auto (下面的代码示例)
  • cl.exe使用/permissive-选项时检测到问题。这是为或启用的,Visual Studio 2019但不是(默认情况下)。Visual Studio CodeVisual 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();)

两种解决方案都已经过测试并解决了编译问题。


推荐阅读