从 VS 2013 到 VS 2017 的电话簿 GUI 转换不起作用
Posted
技术标签:
【中文标题】从 VS 2013 到 VS 2017 的电话簿 GUI 转换不起作用【英文标题】:Phonebook GUI Conversion from VS 2013 to VS 2017 not working 【发布时间】:2018-05-03 05:04:10 【问题描述】:我们在课堂上创建了一个反向电话簿查找。我们的学校系统在我们的机器上使用 VS 2013,而我在家用 PC 上使用 VS 2017。学校搭建的程序在 VS 2013 上运行良好,但是当我用 VS 2017 加载它并尝试执行时,出现以下三个错误:
Severity Code Description Project File Line Suppression State Error (active) E0442 too few arguments for class template "std::array" GUIPhoneBook c:\Users\diabl\source\repos\GUIPhoneBook\GUIPhoneBook\MyForm.cpp 12
Severity Code Description Project File Line Suppression State Error C2976 'std::array': too few template arguments GUIPhoneBook c:\users\diabl\source\repos\guiphonebook\guiphonebook\myform.cpp 13
Severity Code Description Project File Line Suppression State Error C3699 '^': cannot use this indirection on type 'std::array' GUIPhoneBook c:\users\diabl\source\repos\guiphonebook\guiphonebook\myform.cpp 13
这就是我在 MyForm.cpp 中的内容
#include "MyForm.h"
#pragma once
using namespace System;
using namespace System::Windows::Forms;
[STAThread]
int Main(array<System::String ^> ^args)
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
Application::Run(gcnew GUIPhoneBook::MyForm());
return 0;
我对 c++ 和构建 GUI 还很陌生,所以我不知道这意味着什么。我搜索了这个论坛并阅读了与此类似的问题的解决方案,但它们不起作用。有人对修复有任何想法吗?谢谢。
【问题讨论】:
错误信息指向std::array
,但您显示的代码似乎在任何地方都没有使用std::array
,这表明您显示的代码可能与错误,因此您可能需要找到实际导致错误的代码,然后我们才能提供更多帮助。
好的,我将添加您可能认为存在问题的 MyForm.h。
错误信息显示在 MyForm.cpp 的第 12 行或第 13 行。
我发布的第一个代码是 MyForm.cpp 中的所有内容,没有其他内容。我刚刚尝试了 David Yaws 的建议,它奏效了。
【参考方案1】:
我对 c++ 还很陌生...
标准“学习语言”警告:这不是您正在编写的 C++,而是 C++/CLI。 C++/CLI 是一种来自 Microsoft 的语言,旨在允许 C# 或其他 .Net 语言与标准 C++ 交互。在这种情况下,C++/CLI 可以提供两者之间的转换。如果您仍在学习 C++,请不要从 C++/CLI 开始。为了有效地用 C++/CLI 编写,一个人应该已经知道 C++ 和 C#,然后还有一些关于 C++/CLI 的东西需要学习。如果您想学习 C++,请坚持使用标准(非托管)C++。 (在 Visual Studio 中,创建一个“Win32”C++ 项目。)如果你想学习托管代码,那么我会使用 C#。
也就是说……
int Main(array<System::String ^> ^args)
我还没有调查原因,但出于某种原因,VS2017 首先找到了std::array
,而 VS2013 则首先找到了cli::array
。正如您可能从收到的错误消息中猜到的那样,这两个类采用不同的模板/通用参数。 (std::array
接受类型和大小,cli::array
接受类型并且在创建对象时指定大小。)
要解决这个问题,您可以在 main 的声明中明确指定 cli::
。还有可能需要删除 using namespace std;
,或者添加 using namespace cli;
也可以。
【讨论】:
很棒的人,它成功了。我也会让我的教授知道这个小技巧,我真的很感激。我们还没有讨论 CLI,但我相信随着我继续学习 C++,我们会讨论的。以上是关于从 VS 2013 到 VS 2017 的电话簿 GUI 转换不起作用的主要内容,如果未能解决你的问题,请参考以下文章
将 C++ ATL 可执行应用程序从 VS2003 迁移到 VS2013
Visual Studio 安装检测内存工具-Visual Leak Detetctor。(适用于VS2013VS2015VS2017VS2019VS2022版本)