Error en la inicialización de la matriz en C ++ administrado (seguimiento)
-
08-07-2019 - |
Pregunta
Seguimiento de mi pregunta anterior.
¿Alguien puede explicar por qué el siguiente código se compila sin ningún error:
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)
};
Sin embargo, esto me da " error C2440: 'inicializando': no ??se puede convertir de 'VdbParameterInfo ^' a 'VdbMethodInfo ^ "
typedef array<VdbMethodInfo^> MethodArray;
typedef array<VdbParameterInfo^> ParameterArray;
MethodArray^ methods = gcnew MethodArray {
gcnew VdbMethodInfo("createTable", gcnew ParameterArray {
gcnew VdbParameterInfo("name", "string", "Paul")};
)
};
Todo lo que he hecho es intentar '' anidar '' la matriz de parámetros dentro de la inicialización de la matriz de métodos ... No importa directamente: el constructor de VdbMethodInfo toma, como segundo argumento, una matriz de parámetros.
Parece implicar que la inicialización de la matriz C ++ administrada espera que cualquier anidamiento recursivo tenga el mismo tipo ... (es decir, creo que esto debe ser un error)
Pregunta relacionada: aquí
Solución
He encontrado una solución que hace que la sintaxis sea más limpia de todos modos. Yo uso el " ... " sintaxis (C ++ administrado equivalente a la palabra clave C # " params "):
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;
}
};