2009-05-07 7 views
1

내 이전 질문을 후속합니다.Managed C++의 어레이 초기화 버그 (후속 조치)

typedef array<VdbMethodInfo^> MethodArray; 
typedef array<VdbParameterInfo^> ParameterArray; 
ParameterArray^ parameters = gcnew ParameterArray { 
    gcnew VdbParameterInfo("name", "string", "Paul")}; 
MethodArray^ methods = gcnew MethodArray { 
    gcnew VdbMethodInfo("createTable", parameters) 
}; 

을하지만이 나에게주는 다음 코드를 컴파일하는 이유

는 사람이 오류없이 설명 할 수

"오류 C2440 : '초기화'VdbMethodInfo^'에서'^ VdbParameterInfo '에서 변환 할 수 없습니다"
typedef array<VdbMethodInfo^> MethodArray; 
typedef array<VdbParameterInfo^> ParameterArray; 
MethodArray^ methods = gcnew MethodArray { 
    gcnew VdbMethodInfo("createTable", gcnew ParameterArray { 
     gcnew VdbParameterInfo("name", "string", "Paul")}; 
    ) 
}; 

나는 "배열"메서드 배열 초기화 내부에 매개 변수 배열을 중첩하려고 ... VdbMethodInfo의 생성자는 두 번째 인수로 ParameterArray를 사용합니다.

그 관리 C++ 배열 초기화를 암시하는 것 같다

은 (즉, 나는이 버그를해야합니다 생각) 어떤 재귀 중첩이 같은 유형을 가질 것으로 예상

관련 질문 : 나는했습니다 here

답변

2

어쨌든 구문을 더 깨끗하게 만드는 해결 방법을 찾았습니다. "..."구문 (C# "params"키워드와 동일한 Managed C++)을 사용합니다.

public ref class MetaData 
{ 
    typedef array<VdbMethodInfo^> MethodArray; 
    typedef array<VdbParameterInfo^> ParameterArray; 
    static ParameterArray^ params(... ParameterArray^ p) 
    { 
     return p; 
    } 
public: 
    static array<VdbMethodInfo^>^ Instance() 
    { 
     ParameterArray^ parameters = gcnew ParameterArray { gcnew VdbParameterInfo("name", "string", "Paul")}; 
     MethodArray^ methods = gcnew MethodArray { 
      gcnew VdbMethodInfo("createTable", 
       params(gcnew VdbParameterInfo("name", "string", "Paul"), 
         gcnew VdbParameterInfo("age", "number", "25"))) 
     }; 

     return methods; 
    } 
};