如何专门化模板构造函数?

Hom*_*lus 5 c++ templates data-structures c++11

如何对模板构造函数进行专门化?为了更好的理解,我举一个代码示例:

template<typename T>
class Stack {
  private:
    int nelem;
    int size;
    vector<T> stack;

  public:
    ~Stack();
    Stack<T>(int t);
    void push(T data);
    T pop();
    T top();
    int getPosTop(){return (nelem--);};
    void cleanStack(){nelem = 0;};
    bool StackEmpty(){ return (nelem == 0);};
    bool StackFull(){ return (nelem == size);};
};


template <typename T>       // constructor definition here
Stack<T>::Stack<T>(int t){
  size = t;
  nelem = 0;
};

int main(){



return 0;
}
Run Code Online (Sandbox Code Playgroud)

它有很多错误。然后,我读到另一篇文章,一些建议,它正在取代

template <typename T>
    Stack<T>::Stack<T>(int t){
Run Code Online (Sandbox Code Playgroud)

template <typename T> template <typename T> Stack<T>::Stack<T> (int t){
Run Code Online (Sandbox Code Playgroud)

这还不够。

我缺少什么?而且,其背后的想法是什么?

Mik*_*han 5

您想知道如何专门Stack<T>::Stack 针对 的特定值构建构造函数T。您按照图示进行操作:-

#include <vector>
#include <iostream>

template<typename T>
class Stack {
private:
    std::size_t nelem;
    std::size_t size;
    std::vector<T> stack;

public:
    ~Stack(){};
    Stack<T>(std::size_t n);
    void push(T data);
    T pop();
    T top();
    std::size_t getPosTop(){return (nelem--);};
    void cleanStack(){nelem = 0;};
    bool StackEmpty(){ return (nelem == 0);};
    bool StackFull(){ return (nelem == size);};
};

template <typename T>
Stack<T>::Stack(std::size_t t){
    size = t;
    nelem = 0;
    std::cout << "Constructing a `Stack<T>`\n";
}

template <>
Stack<std::string>::Stack(std::size_t t){
    size = t;
    nelem = 0;
    std::cout << "Constructing a `Stack<T>` with `T` = `std::string`\n";
}

template <>
Stack<int>::Stack(std::size_t t){
    size = t;
    nelem = 0;
    std::cout << "Constructing a `Stack<T>` with `T` = `int`\n";
}

int main() {
    Stack<float> sf{2};
    Stack<int> si{3};
    Stack<std::string> ss{4};
    sf.cleanStack();
    si.cleanStack();
    ss.cleanStack();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

哪个输出:-

Constructing a `Stack<T>`
Constructing a `Stack<T>` with `T` == `int`
Constructing a `Stack<T>` with `T` == `std::string`
Run Code Online (Sandbox Code Playgroud)

现场演示