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

Sys*_*gon 16 .net arrays c++-cli visual-c++ visual-studio-2012

我有使用这样的数组的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; 
}
Run Code Online (Sandbox Code Playgroud)

它正在编译,直到我将库"array"添加到项目中:

#include <array>
Run Code Online (Sandbox Code Playgroud)

然后我不知道如何使用托管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"
Run Code Online (Sandbox Code Playgroud)

怎么解决这个?我尝试using namespace std从该文件中删除,但它没有任何区别.我应该从项目中的每个其他C++文件中删除它吗?

Han*_*ant 48

显然你using namespace std;在某个地方有一个范围.如果你找不到它,请注意它在.h文件中的使用.

您可以解决歧义,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;
}
Run Code Online (Sandbox Code Playgroud)

  • 当然,这就是问题所在.仅从C++/CLI文件中删除它是不够的.谢谢.你的第二个选项工作得很好,但我决定在我的项目中删除`using namespace std`. (4认同)