【问题标题】:Error C2976 'std::array': too few template arguments & others after migrating to VS 2019错误 C2976 'std::array':迁移到 VS 2019 后模板参数和其他参数太少
【发布时间】:2020-05-21 09:54:03
【问题描述】:

尝试在 Visual Studio 2019 中编译 c++ 文件时出现以下错误。构建该软件的开发人员说这曾经在 Visual Studio 2012 上工作。

我收到以下错误:

Severity    Code    Description Project File    Line    Suppression State
Error   C2976   'std::array': too few template arguments    CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 45  
Error   C3699   '^': cannot use this indirection on type 'std::array'   CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 45  
Error   C2976   'std::array': too few template arguments    CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 45  
Error   C2027   use of undefined type 'std::array'  CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 45  
Error   C2976   'std::array': too few template arguments    CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 46  
Error   C3699   '^': cannot use this indirection on type 'std::array'   CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 46  
Error   C2976   'std::array': too few template arguments    CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 46  
Error   C2027   use of undefined type 'std::array'  CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 46  
Error   C2976   'std::array': too few template arguments    CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 47  
Error   C3699   '^': cannot use this indirection on type 'std::array'   CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 47  
Error   C2976   'std::array': too few template arguments    CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 47  
Error   C2027   use of undefined type 'std::array'  CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 47  
Error   C2976   'std::array': too few template arguments    CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 49  
Error   C3699   '^': cannot use this indirection on type 'std::array'   CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 49  
Error   C2976   'std::array': too few template arguments    CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 49  
Error   C2027   use of undefined type 'std::array'  CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 49  
Error   C2976   'std::array': too few template arguments    CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 50  
Error   C3699   '^': cannot use this indirection on type 'std::array'   CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 50  
Error   C2976   'std::array': too few template arguments    CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 50  
Error   C2027   use of undefined type 'std::array'  CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 50  
Error   C2582   'operator =' function is unavailable in 'std::array'    CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 52  
Error   C2582   'operator =' function is unavailable in 'std::array'    CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 53  
Error   C2582   'operator =' function is unavailable in 'std::array'    CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 54  
Error C2664 'void CalculatorLibrary::ExternalInterface::AddHubInformationv                    (int,cli::array<double,1> ^,cli::array<System::String ^,1> ^,cli::array<System::String ^,1> ^)': cannot  convert argument 2 from 'std::array *' to 'cli::array<double,1> ^'   CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 57  
Error   C2976   'std::array': too few template arguments    CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 76  
Error   C3699   '^': cannot use this indirection on type 'std::array'   CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 76  
Error   C2976   'std::array': too few template arguments    CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\CalculatorsAIMMSInterop.cpp 76  

这是失败的代码:

#include "stdafx.h"
#include <msclr/marshal.h>
#include "CalculatorsAIMMSInterop.h"

using namespace msclr::interop;
using namespace System;
using namespace System::Reflection;
using namespace std;

void marshalString(System::String^ input, char* output)
{
    //marshal_context ^ context = MarshalContextSingleton::GetInstance();
    marshal_context ^ context = gcnew marshal_context();
    const char* strResult = context->marshal_as<const char*>(input);
    strcpy(output, strResult);
    delete context;
}

void marshalInt(System::Int32 input, char* output) 
{
    //marshal_context ^ context = MarshalContextSingleton::GetInstance();
    marshal_context ^ context = gcnew marshal_context();
    const char* strResult = context->marshal_as<const char*> (""+input);
    strcpy(output, strResult);
    delete context;
}

System::String^ marshalString(char* input)
{
    //marshal_context ^ context = MarshalContextSingleton::GetInstance();
    marshal_context ^ context = gcnew marshal_context();
    System::String^ output = context->marshal_as<System::String^>(input);
    delete context;
    return output;
}

// Methods for hub activity calculator
void WINAPI HubActivityInitialize(int calenderStart, int calendarEnd) {
    CalculatorLibrary::ExternalInterface::InitializeHubActivityCalculator(calenderStart, calendarEnd);
}

void WINAPI HubActivityAddInformation(int numberOfValues, double* activities, char** arrivalTimes, char** departureTimes) {
    array<double>^ activitiesDoubles = gcnew array<double>(numberOfValues);
    array<String^>^ arrivalTimeStrs = gcnew array<String^>(numberOfValues);
    array<String^>^ departureTimeStrs = gcnew array<String^>(numberOfValues);

    array<int>^ arrivalTimeInts = gcnew array<int>(numberOfValues);
    array<int>^ departureTimeInts = gcnew array<int>(numberOfValues);
    for (int i = 0; i < numberOfValues; i++) {
        activitiesDoubles[i] = activities[i];
        arrivalTimeStrs[i] = marshalString(arrivalTimes[i]);
        departureTimeStrs[i] = marshalString(departureTimes[i]);
    }

    CalculatorLibrary::ExternalInterface::AddHubInformation(numberOfValues, activitiesDoubles, arrivalTimeStrs, departureTimeStrs);
}

void WINAPI HubActivityGet(double* amounts) {
    System::Collections::Generic::List<double>^ hubActivityAmounts = CalculatorLibrary::ExternalInterface::GetHubActivity();
    for(int i = 0; i < hubActivityAmounts->Count; i++ )
    {
        amounts[i] = hubActivityAmounts[i];
    }
}

void WINAPI HubActivityReset() {
    CalculatorLibrary::ExternalInterface::ResetHubActivity();
}

// Methods for conveying calculator
void WINAPI ConveyingInitialize(int start, int end, char** startedConveyingQuantity) {
    int numberOfValues = end - start + 1;

    array<String^>^ quantity = gcnew array<String^>(numberOfValues);
    for (int i = 0; i < numberOfValues; i++) {
        quantity[i] = marshalString(startedConveyingQuantity[i]);
    }

    CalculatorLibrary::ExternalInterface::InitializeConveyingCalculator(start, end, quantity);
}

void WINAPI ConveyingAddPieceInformation(int numberOfPieces, char** inMovementsIds) {
    array<String^>^ incomingMovementIds = gcnew array<String^>(numberOfPieces);

    for (int i = 0; i < numberOfPieces; i++) {
        incomingMovementIds[i] = marshalString(inMovementsIds[i]);
    }

    CalculatorLibrary::ExternalInterface::AddConveyingPieceInformation(numberOfPieces, incomingMovementIds);
}

void WINAPI ConveyingAddConnectionInformation(int numberOfConnections, char** inMovementsIds, char** outMovementsIds, char** numberOfConnectedPieces) {
    array<String^>^ incomingMovementIds = gcnew array<String^>(numberOfConnections);
    array<String^>^ outgoingMovementIds = gcnew array<String^>(numberOfConnections);
    array<String^>^ connectedPieces = gcnew array<String^>(numberOfConnections);

    for (int i = 0; i < numberOfConnections; i++) {
        incomingMovementIds[i] = marshalString(inMovementsIds[i]);
        outgoingMovementIds[i] = marshalString(outMovementsIds[i]);
        connectedPieces[i] = marshalString(numberOfConnectedPieces[i]);
    }

    CalculatorLibrary::ExternalInterface::AddConveyingConnectionInformation(incomingMovementIds, outgoingMovementIds, connectedPieces);
}

void WINAPI ConveyingRunCalculation() {
    CalculatorLibrary::ExternalInterface::RunConveyingCalculation();
}

void WINAPI ConveyingResultGet(char** pieceMovementIDOut, char** pieceTimeAtConveyor) {
    array<int>^ pieceOutgoingMovement = CalculatorLibrary::ExternalInterface::GetPieceOutgoingMovement();
    array<int>^ pieceConveyorEntryTime = CalculatorLibrary::ExternalInterface::GetPieceConveyorEntryTime();

    for(int i = 0; i < pieceOutgoingMovement->Length; i++ )
    {
        marshalInt(pieceOutgoingMovement[i], pieceMovementIDOut[i]);
        marshalInt(pieceConveyorEntryTime[i], pieceTimeAtConveyor[i]);
    }
}

void WINAPI ConveyingReset() {
    CalculatorLibrary::ExternalInterface::ResetConveying();
}

// Methods for conveying calculator via text files
void WINAPI ConveyingInitializeFromFile(char* filePath) {
    String^ path = marshalString(filePath);
    CalculatorLibrary::ExternalInterface::InitializeConveyingCalculator(path);
}

void WINAPI WriteConveyingCalculationToFile(char* filePath) {
    String^ path = marshalString(filePath);
    CalculatorLibrary::ExternalInterface::WriteConveyingCalculatorData(path);
}

// Methods for Route Generation
void WINAPI InitializeCaseWithLogging(char* logfile_name) {
    RouteGeneration::IO::ExternalInterface::Initialize(marshalString(logfile_name));
}

int WINAPI GetRouteGenerationInputErrorCount() {
    return RouteGeneration::IO::ExternalInterface::CloseErrorLogAndRetrieveErrorCount();
}

void WINAPI RouteGenerationInitializeFromFiles(char* filePath1, char* filePath2, char* errorMessage) {
    String^ path1 = marshalString(filePath1);
    String^ message1 = RouteGeneration::IO::ExternalInterface::ReadNetworkModelInformation(path1);

    if (message1 != "OK") {
        marshalString(message1, errorMessage);
        return;
    }

    String^ path2 = marshalString(filePath2);
    String^ message2 = RouteGeneration::IO::ExternalInterface::ReadRouteGenerationRequests(path2);

    marshalString(message2, errorMessage);
}

void WINAPI RunRouteGeneration() {
    RouteGeneration::IO::ExternalInterface::GenerateRoutes();
}

void WINAPI RunAllToAllRouteGeneration(char* modelDataFilePath, char* requestDataFilePath, char* databaseFilePath, char* errorMessage) {
    String^ modelDataPath = marshalString(modelDataFilePath);
    String^ requestDataPath = marshalString(requestDataFilePath);
    String^ databasePath = marshalString(databaseFilePath);

    String^ message = RouteGeneration::IO::ExternalInterface::ReadAndGenerateAllToAllRoutes(modelDataPath, requestDataPath, databasePath);
    marshalString(message, errorMessage);
}

void WINAPI WriteGeneratedRoutesToFile(char* filePath, char* errorMessage) {
    String^ path = marshalString(filePath);
    String^ message = RouteGeneration::IO::ExternalInterface::WriteGeneratedRoutes(path);

    marshalString(message, errorMessage);
}

void WINAPI RouteGenerationReset() {
    RouteGeneration::IO::ExternalInterface::CleanMemory();
}

// Methods for Hub Simulation
void WINAPI InitializeSimulationCaseWithLogging(char* logfile_name) {
    HubSimulation::IO::ExternalInterface::Initialize(marshalString(logfile_name));
}

int WINAPI GetHubSimulationInputErrorCount() {
    return HubSimulation::IO::ExternalInterface::CloseErrorLogAndRetrieveErrorCount();
}

void WINAPI HubSimulationInitializeFromFiles(char* filePath1, char* filePath2, char* errorMessage) {
    String^ path1 = marshalString(filePath1);
    String^ message1 = HubSimulation::IO::ExternalInterface::ReadHubSimulationModelInformation(path1);

    if (message1 != "OK") {
        marshalString(message1, errorMessage);
        return;
    }

    String^ path2 = marshalString(filePath2);
    String^ message2 = HubSimulation::IO::ExternalInterface::ReadPiecesInformation(path2);

    marshalString(message2, errorMessage);
}

void WINAPI RunHubSimulation() {
    HubSimulation::IO::ExternalInterface::RunSimulation();
}

void WINAPI WriteHubSimulationResultsToFile(char* filePath, char* errorMessage) {
    String^ path = marshalString(filePath);

    String^ message = HubSimulation::IO::ExternalInterface::WriteSimulationResults(path);
    marshalString(message, errorMessage);
}

void WINAPI HubSimulationReset() {
    HubSimulation::IO::ExternalInterface::CleanMemory();
}

【问题讨论】:

  • 如果您显示一些 VS 无法编译的代码行(MWE)会对我们有所帮助
  • 如果代码有std::array,我认为更新的编译器会是更好的选择。话虽如此,我看到代码是c++-cli
  • array&lt;double&gt;^ 看起来不像 std::array。我认为这个bug是由using namespace std;https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice引起的
  • 我正在使用 Visual Studio Community Edition 2019
  • 尝试删除 using namespace std; 并修复由此产生的错误。

标签: c++ visual-studio visual-studio-2012 c++-cli visual-studio-2019


【解决方案1】:

为什么没有可供下载的 Visual Studio Express 2012?

有。谷歌搜索“visual studio express 2012 下载”会直接将您带到https://visualstudio.microsoft.com/vs/older-downloads,您可以从中下载应用程序。


话虽如此,安装此特定软件可能无法解决您的问题。您没有向我们展示代码,也没有告诉我们您使用的是哪个编译器(显然它不是 Visual Studio 2012;它是否更旧?更新?)。但似乎不太可能通过版本更改来修复来自 std::array 的“模板参数太少”错误。

错误提示正在传递std::array *;这是不存在的事情。没有类型std::array;只有 std::array&lt;T, N&gt; 这样的模板特化。

您应该要求作者澄清,因为这似乎是一个代码错误。然后,选择使用最新的 Visual Studio,而不是过时的软件。


C# 也是另外一回事。大概该项目包含 C#,然后将此 C++/CLI 代码作为互操作层。但是 C# 与您的问题和您的问题无关。

【讨论】:

  • 非常感谢带翅膀的小行星。我试图从同一个页面下载,但它链接我到一个登录页面,在我登录后,它说没有什么可下载的!!很奇怪。
  • @AlirezaAsadi:说真的,老兄,只需修复代码。如果您可以将其隔离为几行,那么我们可以建议修复。可能就像将#include &lt;array&gt; 放入预编译的标头中一样简单。
  • 关于代码,确实主要代码是C#,但是使用了C++/CLI层作为过渡层,造成了麻烦。 C# 部分编译完美,但是,在 C++ 部分中,有一个名为 AssemblyInfo.cpp 的外部依赖项,它给出以下错误:严重代码描述项目文件行抑制状态错误 C1083 无法打开源文件:'C:\WINDOWS\TEMP \.NETFramework,Version=v4.5.AssemblyAttributes.cpp': 没有这样的文件或目录 CalculatorsAIMMSInterop C:\DELTA\NDHCalculators\Development\CalculatorsAIMMSInterop\c1xx 1
  • @Bathsheba:我正在尝试找出要分享的部分以获得答案。代码很大!
  • @AlirezaAsadi:你尝试过预编译的头文件修复吗?
【解决方案2】:

您正在使用 cli 名称空间。尝试指定 cli::array.

实际上,@drescherjm 之前已经提到过这一点。该代码使用 C++/CLI。类型“数组”存在于clistd 命名空间中,分别为arraytuple。要解决此问题,指定 cli::array 将显式使用 array。 更多详情:https://stackoverflow.com/a/23062795/2212381

【讨论】:

  • 尝试解释您提供的解决方案。它总能帮助用户更好地理解问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多