【问题标题】:Template specialization with classes带有类的模板专业化
【发布时间】: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&lt;&gt; 不是对编译器说我不是仅使用模板规范创建另一个对象吗?

【问题讨论】:

  • Person&lt;char&gt; 不包含名为 prv 的成员。
  • Should it take the private variables from first declaration of class Person? 不。你认为它为什么应该这样做?
  • 那么使用模板特化有什么意义呢?为什么不直接定义另一个类。
  • 模板特化不是继承
  • @user3706129:当你专门化一个类模板时,你正在创建另一个类。你专业化的原因是为了让调用者仍然可以是通用的。例如,调用者可能正在使用Person&lt;T&gt;。专业化使他们不必检查 T 是否是 char 就知道要使用哪个类。

标签: c++ templates c++11


【解决方案1】:

实现您想要做的更简单的方法是:

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;
}

因为你想要的是专门化成员函数,而不是整个类。

【讨论】:

    【解决方案2】:

    你可以只专门化方法:

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

    【讨论】: