+ 1

how to avoid warning in my own stack template

Hi I have tried to implement stack class as template type as below: https://code.sololearn.com/cy3PSIom22ft I am getting warning on the code for char* using on my stack implementation. Need your suggestion on the same in order to avoid warning. Thanks in advance...!

18th Jun 2020, 3:33 PM
Ketan Lalcheta
Ketan Lalcheta - avatar
5 Answers
+ 2
Declaration of stack s mystack<const char*> s; change the static_casts to static_cast<const char*> Alternatively you can use const_cast<char*> instead of static_cast
18th Jun 2020, 4:23 PM
Anthony Maina
Anthony Maina - avatar
+ 1
String literals are immutable so I believe the warnings here are useful. You could use const_cast<type>(arg) to cast away the constness but I would advice against it. String literals are read-only and if they're modified the program will probably crash (or evoke undefined behavior). The danger is that you could do something like this: char *a = s.top() *a = 'C'; If the stack accepts <const char *> the static casts are not needed, the warnings will go away and the compiler will complain if you try to modify the strings or assign them to a mutable datatype.
18th Jun 2020, 4:29 PM
Gen2oo
Gen2oo - avatar
+ 1
Both the option worked... I am confused now on immutable.. I generally used to modify the string as below: string s = "welcome "; string name = "Ketan"; s += name; cout << s; Isn't it good ? If so, what's best to do same?
18th Jun 2020, 4:51 PM
Ketan Lalcheta
Ketan Lalcheta - avatar
+ 1
Ketan Lalcheta Yes that's fine. std::string is mutable because it copies the string literal into an internal buffer. "string literal" <-- like that one, is a const char * and is not mutable. I think the confusion is due to the difference between char *, const char *, and std::string.
18th Jun 2020, 5:38 PM
Gen2oo
Gen2oo - avatar
0
Okay Gen2oo , I updated and removed costantness by using const_cast while adding to stack... Reason of same is that I wanted to allocate the memory in case of pointer data type... However , I got confused with how to allocate memory... template<typename T> node<T>::node(T idata) { if(is_pointer<T>::value) { data = new static_cast<*T>; } data = idata; } I thought to add parametric constructor for node data addition. But how to do new operator is confusing me
19th Jun 2020, 5:08 PM
Ketan Lalcheta
Ketan Lalcheta - avatar