1

関数にパラメーターを追加しようとしていますが、新しいパラメーターを構造体型にする必要があります。

dyld_decache.cppから、変更したい関数を次に示します。

void prepare_patch_objc_methods(uint32_t method_vmaddr, uint32_t override_vmaddr);

私はそれを次のように変更しました:

template <typename T>
void prepare_patch_objc_methods(typename T::type, uint32_t list_vmaddr, uint32_t override_vmaddr);

の実装内で、prepare_patch_objc_methods出現method_tするすべてのをに変更したところT、正常にコンパイルされました。

構造体は次のmethod_tように定義されます。

struct method_t {
    uint32_t name;
    uint32_t types;
    uint32_t imp;
};

では、この関数を呼び出すときに構造体型を渡すにはどうすればよいでしょうか。

私はこれをやろうとしました

this->prepare_patch_objc_methods(method_t, class_data->baseMethods, class_obj->data + offsetof(class_ro_t, baseMethods));

しかし、次のエラーが表示されます。'method_t' does not refer to a value

4

2 に答える 2

4

構造体型のオブジェクトを関数に渡す必要はないようです (型自体を渡すだけでよい) ため、正しい関数宣言は次のようになります。

template <typename T>
void prepare_patch_objc_methods(uint32_t list_vmaddr, uint32_t override_vmaddr);

構造体型を関数に渡すには、次のように呼び出します

this->prepare_patch_objc_methods<method_t>(class_data->baseMethods, class_obj->data + offsetof(class_ro_t, baseMethods));

パラメータ型のオブジェクトを実際に渡す必要がある場合は、次のようにします。

template <typename T>
    void prepare_patch_objc_methods(const T &object, uint32_t list_vmaddr, uint32_t override_vmaddr);

次に、このように呼び出します

method_t obj;
this->prepare_patch_objc_methods<method_t>(obj, class_data->baseMethods, class_obj->data + offsetof(class_ro_t, baseMethods));

または単にこのように

this->prepare_patch_objc_methods(obj, class_data->baseMethods, class_obj->data + offsetof(class_ro_t, baseMethods));

ここでは、型を明示的に指定する必要は必ずしもありません。これは、コンパイラが渡すオブジェクトから型を推測できるためです。

于 2013-03-06T06:59:57.907 に答える
2

型自体ではなく、その型の実際のオブジェクトをパラメーターとして渡す必要があります。

method_t m;

prepare_patch_objc_methods(m, class_data->baseMethods, /* ... */);

編集: これが明確でない場合: 通常のパラメーターとしてタイプ ( などmethod_t) を渡すことはできません。テンプレート パラメーターとしてのみ渡すことができます。関数テンプレートの場合、テンプレート パラメーターは通常、そのパラメーターに渡す型からコンパイラによって自動的に推定されます。

template <class T>
void f(T x) {}

コンパイラは、(たとえば)1パラメータとして渡すと、このインスタンス化に使用Tされることを認識します。代わりにint渡すと、それがその暗示のためであることがわかります。1.0Tdouble

本当に必要な場合 (渡される型として T が選択されるのではなく、T の型に変換された値が必要な場合など)、関数テンプレートのテンプレート パラメーターを、クラス テンプレートに対してできる/行うのと同じように指定できます。たとえば、渡した値が int であっても、double に対してf<double>(1)インスタンス化されます。fしたがって、int は関数に渡される前に double に昇格されます。

于 2013-03-06T06:07:44.820 に答える