Bug in Array-Initialisierung in Managed C ++ (Followup)
-
08-07-2019 - |
Frage
Nach meiner vorherigen Frage auf.
Kann mir jemand erklären, warum der folgende Code kompiliert ohne Fehler:
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)
};
Doch das gibt mir "Fehler C2440: 'Initialisierung': Konvertierung von 'VdbParameterInfo ^' auf‚VdbMethodInfo ^"
typedef array<VdbMethodInfo^> MethodArray;
typedef array<VdbParameterInfo^> ParameterArray;
MethodArray^ methods = gcnew MethodArray {
gcnew VdbMethodInfo("createTable", gcnew ParameterArray {
gcnew VdbParameterInfo("name", "string", "Paul")};
)
};
Alles, was ich getan habe, ist Versuch, „Nest“ der Parameter-Array innerhalb der Methode Feldinitialisierung ... Nicht direkt etwas dagegen -. VdbMethodInfo Konstruktor nimmt, als zweites Argument, eine ParameterArray
Es scheint, dass Managed C ++ Feldinitialisierung zu implizieren, erwartet jede rekursive Verschachtelung die gleiche Art haben ... (das heißt ich glaube, das ein Fehler sein muss)
Verwandte Frage: hier
Lösung
Ich habe eine Abhilfe gefunden, die die Syntax Reiniger ohnehin macht. Ich benutze die "..." Syntax (Managed C ++ entspricht dem C # "params" Schlüsselwort "):
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;
}
};