27

I have my C++/CLI code using arrays like this (for example):

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; 
}

It's compiling fine until I add the library "array" to the project:

#include <array>

Then I don't know how to use the managed CLI array, because the compiler thinks that all the declared arrays are the std::array.

Errors examples:

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

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

How to solve this? I tried removing using namespace std from that file, but it makes no difference. Should I remove that from every other C++ file on the project?

Deduplicator
  • 44,692
  • 7
  • 66
  • 118
SysDragon
  • 9,692
  • 15
  • 60
  • 89

1 Answers1

65

Clearly you have a using namespace std; in scope somewhere. Watch out for it being used in .h file if you cannot find it.

You can resolve the ambiguity, the C++/CLI extension keywords like array are in the cli namespace. This compiles fine:

#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;
}
Hans Passant
  • 922,412
  • 146
  • 1,693
  • 2,536
  • 4
    Certainly, that was the problem. Removing it only from the C++/CLI file was not enough. Thanks. Your second option works fine as well, but I decided to remove the `using namespace std` everywhere in my project. – SysDragon Apr 14 '14 at 14:36