i have a problem with the constructor and templates.
if i register my vector class with constructorDefault<T> it doesnt work because the constructorDefault function is never been called.
only then i use the constructorDefaultf function it works.
is there something i missed?
C++:
template<typename T>
void constructorDefault(void *memory) // this isnt called
{
new (memory) core::vector3d<T>();
}
void constructorDefaultf(void *memory) // works fine
{
new (memory) core::vector3d<float>();
}
template<typename T>
void deconstructor(void *memory)
{
((core::vector3d<T>*)memory)->~vector3d<T>();
}
// called like that -> registerVector3dT<float>(engine, "vector3df", "float");
template<typename T>
void registerVector3dT(asIScriptEngine *engine, const char *typeName, const char *asType)
{
int r;
std::stringstream ss;
// Bind Vector2d<T> class.
r = engine->RegisterObjectType(typeName, sizeof(core::vector3d<T>), asOBJ_VALUE | asOBJ_APP_CLASS_CDA); assert(r >= 0);
//this doesnt work
r = engine->RegisterObjectBehaviour(typeName, asBEHAVE_CONSTRUCT, "void f()", asFUNCTIONPR(constructorDefault<T>, (void*), void), asCALL_CDECL_OBJLAST); assert(r >= 0);
// this works
//r = engine->RegisterObjectBehaviour(typeName, asBEHAVE_CONSTRUCT, "void f()", asFUNCTIONPR(constructorDefaultf, (void*), void), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectBehaviour(typeName, asBEHAVE_DESTRUCT, "void f()", asFUNCTIONPR(deconstructor<T>, (void*), void), asCALL_CDECL_OBJLAST); assert(r >= 0);
// Assignment vector3d<T>& operator=(const vector3d<T>& other)
ss.str("");
ss << typeName << "& opAssign(const " << typeName << " &in)";
r = engine->RegisterObjectMethod(typeName, ss.str().c_str(), asMETHODPR(core::vector3d<T>, operator=, (const core::vector3d<T>&), core::vector3d<T>&), asCALL_THISCALL); assert(r >= 0);
// Bind core::vector3d<T> class properties.
ss.str("");
ss << asType << " X";
r = engine->RegisterObjectProperty(typeName, ss.str().c_str(), offsetof(core::vector3d<T>, X)); assert(r >= 0);
ss.str("");
ss << asType << " Y";
r = engine->RegisterObjectProperty(typeName, ss.str().c_str(), offsetof(core::vector3d<T>, Y)); assert(r >= 0);
ss.str("");
ss << asType << " Z";
r = engine->RegisterObjectProperty(typeName, ss.str().c_str(), offsetof(core::vector3d<T>, Z)); assert(r >= 0);
}
Angelscript:
class d
{
void dummy()
{
vector3df ss();
vector3df sss();
sss = ss;
}
}
in that line it crashed:
void asCScriptEngine::CallObjectMethod(void *obj, asSSystemFunctionInterface *i, asCScriptFunction *s)
line 3394: (((asCSimpleDummy*)obj)->*f)();
callstack:
game.exe![thunk]:asCScriptObject::`vcall'{4,{flat}}' }'?() C++
game.exe!asCScriptEngine::CallObjectMethod(void * obj, asSSystemFunctionInterface * i, asCScriptFunction * s) Zeile 3413 C++
game.exe!asCScriptEngine::CallObjectMethod(void * obj, int func) Zeile 3367 C++
game.exe!asCContext::ExecuteNext() Zeile 2503 C++
game.exe!asCContext::Execute() Zeile 1155 C++
i guess it crashs there because the constructor isnt called.
any help would be appreciated
thx