Printing template types
Dec 17, 2019 at 10:09pm UTC
My usual overload for operator << doesn't seem to be working with templates, no matter what type I put in, I get some weird hex and have tried several methods and always the same. See below string example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
friend std::ostream& operator <<(std::ostream& os, T* data)
{
return os << *data;
}
int main()
{
jlist<std::string>* myList = new jlist<std::string>("test" );
myList->additem("coffee" );
myList->additem("cake" );
jlistIterator<std::string> it(myList);
it.iterator++;
it.iterator--;
std::cout << it.iterator->data; //prints hex
std::cout << myList->deleteitem("fesfef" ) << std::endl;
std::cout << myList->deleteitem("test" ) << std::endl;
std::cout << myList->deleteitem("cake" ) << std::endl;
std::cout << myList->deleteitem("dsdsd" ) << std::endl;
std::cout << myList->length();
getchar();
return 0;
}
FULL CODE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
#ifndef __GENERICLIST__
#define __GENERICLIST__
#include <ostream>
template <typename T>
class jnode {
public :
T* data{ nullptr };
jnode<T>* next{ nullptr };
jnode<T>* prev{ nullptr };
};
template <typename T>
class jlist {
private :
int listLength{ 0 };
public :
jnode<T>* begin{ nullptr };
jnode<T>* end{ nullptr };
jlist() {};
jlist(T item);
~jlist();
int length() { return listLength; }
void additem(T item);
bool deleteitem(T item);
};
template <typename T>
jlist<T>::jlist(T item)
{
jnode<T>* newitem = new jnode<T>;
newitem->data = new T;
*newitem->data = item;
begin = newitem;
end = newitem;
listLength++;
}
template <typename T>
jlist<T>::~jlist()
{
if (listLength == 0)
return ;
if (listLength == 1)
{
delete begin->data;
delete begin;
return ;
}
jnode<T>* iterator = begin;
while (iterator != end && iterator->next != nullptr )
{
delete iterator->data;
iterator = iterator->next;
delete iterator->prev;
}
delete iterator->data;
delete iterator;
}
template <typename T>
void jlist<T>::additem(T item)
{
jnode<T>* newitem = new jnode<T>;
newitem->data = new T;
*newitem->data = item;
if (begin != nullptr && end != nullptr )
{
end->next = newitem;
newitem->prev = end;
end = newitem;
}
else
{
begin = newitem;
end = newitem;
}
listLength++;
}
template <typename T>
bool jlist<T>::deleteitem(T item)
{
if (begin == nullptr )
return false ;
jnode<T>* iterator = begin;
if (begin == end)
{
if (*iterator->data == item)
{
delete iterator->data;
delete iterator;
begin = nullptr ;
end = nullptr ;
listLength--;
return true ;
}
return false ;
}
while (iterator != nullptr )
{
if (*iterator->data == item)
{
if (iterator == begin)
{
begin = iterator->next;
iterator->next->prev = nullptr ;
}
else
iterator->prev->next = iterator->next;
delete iterator->data;
delete iterator;
listLength--;
return true ;
}
iterator = iterator->next;
}
return false ;
}
template <typename T>
class jlistIterator {
private :
jlist<T>* theList{ nullptr };
public :
jnode<T>* iterator{ nullptr };
jlistIterator(jlist<T>* list)
{
theList = list;
iterator = theList->begin;
}
jnode<T>* operator ++()
{
if (iterator->next != nullptr )
return iterator->next;
return nullptr ;
}
jnode<T>* operator --()
{
if (iterator->prev != nullptr )
return iterator->prev;
return nullptr ;
}
friend std::ostream& operator <<(std::ostream& os, T* data)
{
return os << *data;
}
};
#endif
Dec 17, 2019 at 10:42pm UTC
Try putting a print statement in your operator<<, see if it prints.
Pointers are already overloaded to print using standard library's operator<<:
http://www.cplusplus.com/reference/ostream/ostream/operator-free/
Why not just do:
std::cout << *it.iterator->data << '\n' ;
Don't pass a pointer to the data, just pass a reference to the data (an std::string). Then, you won't need to define a custom operator<< because one already exists for std::string.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
#include <iostream>
#include <string>
class Asdf {
};
std::ostream& operator <<(std::ostream& os, const Asdf& asdf)
{
return os << "asdf" ;
}
template <typename T>
void blah(const T& t)
{
std::cout << t << '\n' ;
}
int main()
{
std::string str = "Hello" ;
std::string* p_str = &str;
Asdf asdf;
Asdf* p_asdf = &asdf;
blah(str);
blah(p_str);
blah(asdf);
blah(p_asdf);
}
Last edited on Dec 17, 2019 at 10:59pm UTC
Topic archived. No new replies allowed.