Advertisement

constructor + templates => constructor isnt called

Started by November 27, 2012 03:56 AM
4 comments, last by WitchLord 11 years, 11 months ago
hi,

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
This appears to be a problem with the C++ compiler. For some reason it is not instanciating the template function properly when you register the constructor behaviour.

What C++ compiler and version are you using?

AngelCode.com - game development and more - Reference DB - game developer references
AngelScript - free scripting library - BMFont - free bitmap font generator - Tower - free puzzle game

Advertisement
hi,

i use visual studio 2012, the lastest angelscript rev and win 7 64bit.

i also noticed that this only happens with the default constructor (no arguments are passed). for other methods and behaviours it works.
I'm pretty sure it is a limitation (or maybe a bug) with how templates work in MSVC++. I'll try to reproduce this to further investigate.

AngelCode.com - game development and more - Reference DB - game developer references
AngelScript - free scripting library - BMFont - free bitmap font generator - Tower - free puzzle game

hi,

i finally found the problem. the problem was that i register the default constructor for the vector and the matrix with the same functionname in different source files.
so the defaullt constructor of the maxtrix overrides the vectors default constructor because they have the same structure & name.

thanks anyway
Ah, yes. I remember telling this very same thing to another user that was also having problem with templated wrappers.

I think I'll add an observation about this in the manual. Hopefully it will help avoid the same problem for other users.

Thanks,
Andreas

AngelCode.com - game development and more - Reference DB - game developer references
AngelScript - free scripting library - BMFont - free bitmap font generator - Tower - free puzzle game

This topic is closed to new replies.

Advertisement