Sign in to follow this  
zerochen

constructor + templates => constructor isnt called

Recommended Posts

zerochen    542
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++:
[CODE]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);
}
[/CODE]

Angelscript:
[CODE]
class d
{
void dummy()
{
vector3df ss();
vector3df sss();
sss = ss;
}
}
[/CODE]

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

Share this post


Link to post
Share on other sites
WitchLord    4678
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?

Share this post


Link to post
Share on other sites
zerochen    542
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. Edited by zerochen

Share this post


Link to post
Share on other sites
zerochen    542
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

Share this post


Link to post
Share on other sites
WitchLord    4678
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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this