#include <jni.h>/span>
class FieldAccessor {
public:
FieldAccessor(
JNIEnv* env
) {
this->jNIEnv = env;
}
virtual jobject getValue(jobject, jobject) = 0;
protected:
JNIEnv* jNIEnv;
};
template<typenameType>
class PrimitiveFieldAccessor : public FieldAccessor {
public :
PrimitiveFieldAccessor (
JNIEnv* env, const char name[], const char ctorSig<],
Type (JNIEnv::*getFieldValueFunction) (jobject, jfieldID)
);
jobject getValue(jobject, jobject)。
private:
jclass型別。
jmethodID constructorId。
型別(JNIEnv::*getFieldValueFunction)(jobject, jfieldID)。
};
但是我得到了以下的編譯錯誤:
F:/Shared/Workspaces/Projects/JNI/src/DriverFunctionSupplierNative.cpp。在實體化'_jobject* PrimitiveFieldAccessor<Type>::getValue(jobject, jobject) [with Type = long int; jobject = _jobject*]'/span>。
F:/Shared/Workspaces/Projects/JNI/src/Environment.h:73:11: 需要從這里開始
F:/Shared/Workspaces/Projects/JNI/src/DriverFunctionSupplierNative.cpp:80:2: 錯誤:必須使用'。 *'或'->*'來呼叫指標到成員的函式 in '((PrimitiveFieldAccessor< long int>*)this)->PrimitiveFieldAccessor<long int>。 :getFieldValueFunction (. ...)',例如:'(... ->* ((PrimitiveFieldAccessor<long int>*)this)->PrimitiveFieldAccessor<long int>::getFieldValueFunction) (...)'
這是實作檔案(DriverFunctionSupplierNative.cpp)中的一段:
template<typename Type>
原始欄位訪問器<型別>::PrimitiveFieldAccessor (
JNIEnv* env,
const char name[],
const char ctorSig[],
Type (JNIEnv::*getFieldValueFunction) (jobject, jfieldID)
) : FieldAccessor(env) {
this->jNIEnv = env;
this->type = (jclass)jNIEnv->NewGlobalRef(env->FindClass(name))。
this->constructorId = jNIEnv->GetMethodID(this->type, "< init> "/span>, ctorSig) 。
this->getFieldValueFunction = getFieldValueFunction。
}
template<typenameType>
jobject PrimitiveFieldAccessor<Type>::getValue(jobject target, jobject field) {
jfieldID fieldId = jNIEnv->FromReflectedField(field)。
return jNIEnv->NewObject (
this->型別。
this->constructorId,
this->getFieldValueFunction(目標,fieldId)。
);
}
uj5u.com熱心網友回復:
編譯錯誤很好地描述了這個問題。花點時間閱讀它們,了解它們的含義:
error: must use ' 。 *' or '->*'來呼叫'...'中的指標到成員函式,例如 ...
現在看看你是如何嘗試呼叫這個函式的:
this->callTypeMethodFunction(
...
)
語法將是這樣的:
(jNIEnv->*callTypeMethodFunction)(value, this-> callTypeMethodId)。
同樣的事情也適用于其他的成員函式呼叫的指標:
return jNIEnv->NewObject(
this->型別。
this->constructorId,
(jNIEnv->*getFieldValueFunction)(target, fieldId)
);
現在為什么會出現這樣的情況?
現在,為什么編譯錯誤只發生在你有虛擬方法的時候?這是因為模板實體化的作業方式。你沒有公布類是如何被實體化的,但從癥狀上看,虛擬函式被提前實體化以建立vtable,但其他方法(非虛擬)只能在使用時被實體化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/329619.html
標籤:
上一篇:在不知道總專案的情況下,有什么干凈的方法來映射一個模板?
下一篇:如何防止C 中的模板型別擴展?
