Skip to main content
GameDev.net gamedev.net
🔒 Locked

constructor + templates => constructor isnt called

Started by zerochen Nov 27, 2012 at 3:56 AM 4 replies 2k views
Original Post
zerochen
zerochen
hi,

i have a problem with the constructor and templates.
if i register my vector class with constructorDefault 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 << " ∈)";
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
WitchLord
WitchLord
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 - <a href="http://www.angelcode.com/tower" rel
zerochen
zerochen
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.
WitchLord
WitchLord
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 - <a href="http://www.angelcode.com/tower" rel
zerochen
zerochen
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
WitchLord
WitchLord
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 - <a href="http://www.angelcode.com/tower" rel

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.