6

Ok, so i have this template class, which is kinda like one-way list.

template <typename T> List 

and it have this inside function print

public: void Print(); 

which, as you can guess, prints the list contents from begining to end; However, as template can take classes as T, one can imagine, that i would need different implementations of Print() for that very cases. For example, I have another class Point

class Point{ private: int x, y; public: int getX(); int getY(); } 

so i want Print specifically designed for Points. I tried this:

void List<Point>::Print(); 

but compiler tells me

prototype for void List<Point> Print() doesn match any in class List<Point> 

though

candidates are: from List<T> [with T = Point] void List<Point>::Print() 

For me it seems like the same fucntion. What's wrong? And how do I write T-specific template class functions?

1
  • template<> void List<Point>::Print() Commented Nov 21, 2016 at 14:06

2 Answers 2

9

You use explicit template specialization to specialize behaviour of Print for specific types.

For example, for Point:

template <> // No template arguments here ! void List<Point>::Print() // explicitly name what type to specialize { //code for specific Point Print behaviour.. } 
Sign up to request clarification or add additional context in comments.

6 Comments

Does it goes in class body? Or outside of it?
@YuryElburikh Outside of it.
now it tells me that "no member function "Print" is declared in List<int>"
@YuryElburikh well an int is not a Point. You should still provide a fallback implementation for Print for the other cases.
And what if i only want Print for ints and Points? I did 'template<> void List<int>::Point();' 'template<> void List<Point>::Print();'
|
1

However, as template can take classes as T, one can imagine, that i would need different implementations of Print() for that very cases

Not at all. You can have a single implementation of Print for every type of object - this is why templates are powerful.

One way to do what you want would be to define the stream operator << in Point, and have a generic Print() method in List. This makes Print available to more than just Point.

More generality ftw.

1 Comment

Hmm, this approach I like a whole lot more, however, for this project I have to use Point provided without any modifications to it

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.