Erro na inicialização da matriz em Managed C ++ (continuação)
-
08-07-2019 - |
Pergunta
Na sequência da minha pergunta anterior.
Alguém pode explicar por que os seguintes compila o código sem erros:
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)
};
No entanto, isso me dá "C2440 de erro: 'inicializar': não é possível converter de 'VdbParameterInfo ^' para 'VdbMethodInfo ^"
typedef array<VdbMethodInfo^> MethodArray;
typedef array<VdbParameterInfo^> ParameterArray;
MethodArray^ methods = gcnew MethodArray {
gcnew VdbMethodInfo("createTable", gcnew ParameterArray {
gcnew VdbParameterInfo("name", "string", "Paul")};
)
};
Tudo o que eu tenho feito é tentativa de "ninho" da matriz de parâmetro dentro da inicialização de matriz método ... Não importa diretamente -. Construtor de VdbMethodInfo leva, como um segundo argumento, um ParameterArray
Ele parece implicar que conseguiu C ++ inicialização de matriz espera que qualquer assentamento recursiva para ter o mesmo tipo ... (ou seja, eu acho que isso deve ser um bug)
questão relacionada: aqui
Solução
Eu encontrei uma solução alternativa que torna o limpador sintaxe de qualquer maneira. Eu uso a sintaxe "..." (Managed C ++ equivalente ao C # "params" palavra-chave "):
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;
}
};