1

私の前の質問からのフォローアップ。

次のコードがエラーなしでコンパイルされる理由を誰かが説明できますか?

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のコンストラクターは、2番目の引数としてParameterArrayを取ります。

マネージC++配列の初期化では、再帰的なネストが同じタイプであることが想定されているようです...(つまり、これはバグであるに違いないと思います)

関連する質問:ここ

4

1 に答える 1

2

とにかく構文をきれいにする回避策を見つけました。「...」構文を使用します (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;
    }
};
于 2009-05-07T15:16:57.003 に答える