代码之家  ›  专栏  ›  技术社区  ›  Paul Hollingsworth

托管C++中数组初始化中的错误(后继)

  •  1
  • Paul Hollingsworth  · 技术社区  · 16 年前

    从我以前的问题开始。

    有人能解释一下为什么以下代码编译时没有任何错误吗?

    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:'initializing':无法从'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的构造函数将参数数组作为第二个参数。

    这似乎意味着托管C++阵列初始化要求任何递归嵌套都具有相同的类型…(也就是说,我认为这一定是一个错误)

    相关问题: here

    1 回复  |  直到 16 年前
        1
  •  2
  •   Paul Hollingsworth    16 年前

    我找到了一个解决方法,它可以让语法更清晰。我使用的是“…”语法(管理C++相当于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;
        }
    };
    
    推荐文章