【发布时间】:2025-12-20 07:45:11
【问题描述】:
我正在尝试实现模板专业化。我删除了模板和类:
template <class T>
class Person{
public:
Person(char one, T two){
this -> prv = one;
this -> druh = two;
}
void explain();
private:
char prv;
T druh;
};
并声明它的getter
template <class T>
void Person<T>::explain(){
cout << "Druh isnt char" << endl;
}
现在,如果我创建数据类型不是 char 的对象,它确实会输出“Druh isnt char”,例如
Person <int> obj('a',5);
obj1.explain(); // "Druh isnt char"
我想使用 specialization ,所以当第二个参数是 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;
}
但是我收到了这个错误
“类人”没有名为“prv”的成员|
为什么会这样?它应该从类 Person 的第一个声明中获取私有变量吗? templat<> 不是对编译器说我不是仅使用模板规范创建另一个对象吗?
【问题讨论】:
-
类
Person<char>不包含名为prv的成员。 -
Should it take the private variables from first declaration of class Person?不。你认为它为什么应该这样做? -
那么使用模板特化有什么意义呢?为什么不直接定义另一个类。
-
模板特化不是继承
-
@user3706129:当你专门化一个类模板时,你正在创建另一个类。你专业化的原因是为了让调用者仍然可以是通用的。例如,调用者可能正在使用
Person<T>。专业化使他们不必检查T是否是char就知道要使用哪个类。