+ 1
Why can I only run template function once?
I'm trying to make a custom print statement for ease of use, but I can only use the function once. Why is this? https://code.sololearn.com/chQG40vIrdhz/?ref=app
3 Answers
+ 5
I wouldn't recommend giving templates default values like this.
Here you call it like:
print("hi ", "C++!");
C++ deduced that the type T = const char*
Therefore T y = 0 and the other parameters are now pointer types pointing to 0. And then you try to print it. Yea, undefined behaviour. :)
But even if you did check for y == nullptr and ditto for the other parameters, the function would complain again for other types.
You could potentially default them to T y = T() to give them default types for every type, but that still wouldn't work for types that don't support default construction.
Also do realize you can't mix types because you only use 1 template parameter.
print( "hi", 1 ); would be illegal because T is deduced as const char* again. It can't be both that and an int.
You could do template<typename T, typename U> ... etc to deal with each of them.
That's why I gave you the variadic template function, it deals with that by itself. ( Lookup recursion as well if you don't understand it )
+ 3
Not sure why...but declare your template like this: (default with empty strings).
template <class T>
void print(T x, T y="", T z="", T k="", T i=""){
cout << x << y << z << k << i << endl;
}
+ 2
rodwynnejones A bit late, but that does work weirdly. I'm gonna use that.