同时使用托管数组和 std:array 不兼容

Posted

技术标签:

【中文标题】同时使用托管数组和 std:array 不兼容【英文标题】:Incompatibility using managed array and std:array at same time 【发布时间】:2014-04-14 14:01:24 【问题描述】:

我的 C++/CLI 代码使用这样的数组(例如):

array<String^>^ GetColNames()  
    vector<string> vec = impl->getColNames();
    array<String^>^ arr = gcnew array<String^>(vec.size());

    for (int i = 0; i < vec.size(); i++)  
        arr[i] = strConvert(vec[i]); 
    
    return arr; 

在我将库“数组”添加到项目之前,它编译正常:

#include <array>

那我就不知道怎么使用托管CLI数组了,因为编译器认为所有声明的数组都是std::array

错误示例:

array<String^>^ arr
//           ^ Error here: "too few arguments for class template "std::array""

gcnew array<String^>(vec.size())
//    ^ Error: "Expected a type specifier"

如何解决这个问题?我尝试从该文件中删除using namespace std,但这没有区别。我应该从项目的所有其他 C++ 文件中删除它吗?

【问题讨论】:

c++-cli 肯定不是 C++。 删除using namespace std;?请参阅此处了解更多信息:***.com/questions/1452721/… 你得到了using namespace std;你得到了你应得的:) @Aschratt jrok:已经尝试过(从该文件中删除 using namespace std)。包含 时出现相同的错误 【参考方案1】:

显然,您在某个范围内有一个using namespace std;。如果找不到,请注意它在 .h 文件中的使用情况。

您可以解决歧义,array 等 C++/CLI 扩展关键字位于 cli 命名空间中。这编译得很好:

#include "stdafx.h"
#include <array>

using namespace std;         // <=== Uh-oh
using namespace System;

int main(cli::array<System::String ^> ^args)

    auto arr = gcnew cli::array<String^>(42);
    return 0;

【讨论】:

当然,这就是问题所在。仅从 C++/CLI 文件中删除它是不够的。谢谢。您的第二个选项也可以,但我决定在我的项目中删除using namespace std

以上是关于同时使用托管数组和 std:array 不兼容的主要内容,如果未能解决你的问题,请参考以下文章

c++ 数组与 std::vector 和 std::array 的效率

通过在堆栈上传递std :: array进行API调用是否有优势

从 std::array 获取对原始数组的引用

std::array 与数组性能

变长 std::array 像

c++11 std::array vs 静态数组 vs std::vector