NewObj use on  template with several typename.
- 
 On 09/03/2016 at 15:38, xxxxxxxx wrote: User Information: 
 Cinema 4D Version: R17
 Platform: Mac OSX ;
 Language(s) : C++ ;--------- 
 hi,
 I'm not sure if we can call that a bug or if it's problem with my syntax.i've defined a class using template with several typename. NewObj doesn't want those templates. 
 i've got the message "parse issue"
 : Expected '>'
 : Type name requires a specifier or qualifiera very simplified class : template <typename T, typename T2> class myclass { public: T toto; T2 tata; myclass(); ~myclass(); }; template <typename T, typename T2> myclass<T, T2>::myclass() { } template <typename T, typename T2> myclass<T, T2>::~myclass(){ } //somewhere else // got the error message myclass<Int32, Vector>* titi = NewObj(myclass<Int32, Vector>);the following code generate error : 
 : Too many arguments provided to function-like macro invocation
 : Use of undeclared identifier 'SIZEOF'Int theSize = SIZEOF(myclass<Int32, Vector>);but the following compile with no errors (but i know it's not a clean solution) : myclass<Int32, Vector>* toto = MAXON_SAFE_PLACEMENT_NEW(maxon::DefaultAllocator::Alloc((maxon::Int)sizeof(myclass<Int32, Vector>), C4D_MISC_ALLOC_LOCATION)) myclass<Int32, Vector>();It does work if myclass only got one typename. Thanks a lot. 
- 
 On 10/03/2016 at 04:06, xxxxxxxx wrote: Hey Valkaari, this is a known problem with macros. The comma in the template arguments is used as 
 separator for the macro arguments instead. This answer from SO might help you:http://stackoverflow.com/a/4298441/791713 Basically, you build another macro that wraps the type for you, like this: template<typename T> struct get_first_param; template<typename R, typename P1> struct get_first_param<R(P1)> { typedef P1 type; }; #define Identity(...) get_first_param<void(__VA_ARGS__)>::type // Then to use NewObj() : myclass<Int32, Vector>* obj = NewObj(Identity(myclass<Int32, Vector>));
- 
 On 10/03/2016 at 06:21, xxxxxxxx wrote: Hi, As specified on the stackoverflow thread, the type wrapper is useful because it works with previous C++11 standard where variadics arguments in macro weren't introduced yet. 
 If you can use __VA_ARGS__ then this should works:#define FIX_ARG(...) __VA_ARGS__ myclass<Int32, Vector>* tata = NewObj(FIX_ARG(myclass<Int32, Vector>));or (worst) : #ifdef SIZEOF #undef SIZEOF #endif #define SIZEOF(x...) ((maxon::Int)sizeof(x)) #define COMMA , myclass<Int32, Vector>* tata = NewObj(myclass<Int32 COMMA Vector>);
- 
 On 10/03/2016 at 09:24, xxxxxxxx wrote: Hello, it seems that using a typedef may also help: typedef myclass<Int32, Vector> IntVectorClass; IntVectorClass* intVector = NewObj(IntVectorClass);best wishes, 
 Sebastian
- 
 On 11/03/2016 at 02:26, xxxxxxxx wrote: Thanks for the answers, several solutions, i like it  
 And more important i think i understood all the solutions.