问题
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:
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..
}
回答2:
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.
来源:https://stackoverflow.com/questions/40722055/template-class-type-specific-functions