Ошибка инициализации массива в Managed C ++ (продолжение) - PullRequest
1 голос
/ 07 мая 2009

В продолжение моего предыдущего вопроса.

Может кто-нибудь объяснить, почему следующий код компилируется без ошибок:

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:« инициализация »: невозможно преобразовать из« VdbParameterInfo ^ »в« VdbMethodInfo ^ »

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 ++ предполагает, что любое рекурсивное вложение имеет один и тот же тип ... (т.е. я думаю, что это должно быть ошибкой)

Смежный вопрос: здесь

1 Ответ

2 голосов
/ 07 мая 2009

Я нашел обходной путь, который в любом случае делает синтаксис чище. Я использую синтаксис "..." (управляемый C ++, эквивалентный ключевому слову "params" в 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;
    }
};
...