我在頭檔案(Environment.h)中宣告了以下類,我想讓超類FieldAccessor成為抽象的:
我在頭檔案(Environment.h)中宣告了以下類,我想讓超類FieldAccessor成為抽象的。
我在頭檔案(Environment.h)中宣告了以下類,我想讓超類FieldAccessor成為抽象的:
我在頭檔案(Environment.h)中宣告了以下類,我想讓超類FieldAccessor成為抽象的:
... 但我得到了以下的編譯錯誤:
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,但其他方法(非虛擬)只能在使用時被實體化。
uj5u.com熱心網友回復:
通過將呼叫成員函式指標的代碼this->getFieldValueFunction(target, fieldId)替換為(jNIEnv->*getFieldValueFunction)(target, fieldId)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/316133.html
標籤:
