2016-03-04 3 views
0

Я пытаюсь реализовать специализацию шаблона. Я delcared шаблон и класс:Шаблон специализации с классами

template <class T> 
class Person{ 

public: 

     Person(char one, T two){ 

      this -> prv = one; 
      this -> druh = two; 

     } 
     void explain(); 

private: 

    char prv; 
    T druh; 

}; 

и объявил его поглотитель

template <class T> 

void Person<T>::explain(){ 

    cout << "Druh isnt char" << endl; 

} 

Теперь, если я создать объект с типом данных, кроме гольца, он будет indeeed выведите «друх Isnt обугливается», например

Person <int> obj('a',5);  
obj1.explain(); // "Druh isnt char" 

Я хочу использовать специализацию, поэтому, когда второй аргумент обугливается он будет говорить "Druh is char"

Я попробовал его с помощью:

/********* шаблона специализации ***********/

template<> 

class Person<char>{ 

public: 
     Person(char one, char two){ 

      this-> prv = one; 
      this-> druh = two; 

     } 
     void explain(); 

}; 

и определен метод объяснения снова

void Person<char>::explain(){ 

    cout << "Druh is a char " << endl; 

} 

Но я получаю эту ошибку

«класс Person» не имеет ни одного члена с именем «частная» |

Почему это происходит? Должны ли они принимать частные переменные от первого объявления класса Person? Doesnt templat<> говорит компилятору, что я не создаю другой объект только с использованием спецификации шаблона?

+0

класс '' Человек не содержит элемент с именем 'prv'. – Nard

+0

'Должен ли он принимать частные переменные от первого объявления класса Person?' Нет. Почему вы думаете, что он должен это делать? – cpplearner

+0

В чем смысл использования специализации шаблонов? Почему бы просто не определить другой класс. – user3706129

ответ

1

Вы можете специализироваться только метод:

template <> 
void Person<char>::explain(){ 
    cout << "Druh is char" << endl; 
} 
3

Более простой способ достижения того, что вы хотите сделать это:

template <typename T> 
class A { 
public: 
    A() : c('z') { 
    } 
    void printChar() { 
     std::cout << "Not a char!" << std::endl; 
    } 
private: 
    char c; 
}; 

template <> 
void A<char>::printChar() { 
    std::cout << c << std::endl; 
} 

Так что вы хотите специализироваться функции-члена, а не весь класс.

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