2016-11-21 5 views
1

Итак, у меня есть этот класс шаблонов, который как бы подобен одностороннему списку.Функции типа класса шаблона

template <typename T> List 

и имеют эту внутреннюю функцию печати

public: 
void Print(); 

, который, как вы можете догадаться, печатает содержимое списка от начала до конца; Однако, поскольку шаблон может принимать классы как T, можно представить себе, что для этих случаев мне понадобятся разные реализации Print(). Например, у меня есть еще один класс. Точка

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

поэтому я хочу печать, специально предназначенную для очков. Я попытался это:

void List<Point>::Print(); 

но компилятор говорит мне

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

хотя

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

Для меня это похоже, то же fucntion. Что не так? И как мне написать T-специфичные функции класса шаблона?

+0

'template <> void Список :: Печать()' – AndyG

ответ

2

Вы используете explicit template specialization, чтобы уточнить поведение Print для конкретных типов.

Например, для Point:

template <> // No template arguments here ! 
void List<Point>::Print() // explicitly name what type to specialize 
{ 
    //code for specific Point Print behaviour.. 
} 
+0

Это происходит в классе? Или вне его? –

+0

@YuryElburikh Вне этого. –

+0

теперь он говорит мне, что «никакая функция-член« Печать »не объявлена ​​в списке « –

0

Однако, как шаблон может принимать классы как Т, можно представить себе, что я бы нужны различные реализации печати() для этого самых случаев

Совсем нет. У вас может быть одна реализация Print для каждого типа объектов - вот почему шаблоны являются мощными.

Один из способов сделать то, что вы хотите, будет определять потоковый оператор << в Point, и имеют общий Print() метод в List. Это делает Print доступным не более чем для Point.

Больше общности ftw.

+0

Хм, этот подход мне больше нравится, однако для этого проекта я должен использовать Point без каких-либо изменений в нем –

Смежные вопросы