2017-09-12 4 views
2

テンプレートコンストラクタで特殊化を行うにはどうすればよいですか?テンプレートコンストラクタをテンプレート化する方法は?

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

それはエラーがたくさん来た: より良い理解のために、私はコードの例をもたらすでしょう。 はその後、私は十分ではなかった

template <typename T> template <typename T> Stack<T>::Stack<T> (int t){ 

template <typename T> 
    Stack<T>::Stack<T>(int t){ 

を交換した別のポスト、いくつかの提案を、お読みください。

私には何が欠けていますか?そして、その背後にある考え方は何ですか?

+1

コンストラクタはテンプレートではありませんので、あなたは、コンストラクタを専門とすることはできません。それは、クラステンプレートの非テンプレートメソッドです。 –

答えて

1

だろう

template <typename T> 
Stack<T>::Stack(int t){ /*...*/ } 

を使用する必要がありますコンストラクタだけを特殊化する場合は、Tという特定の値の場合はStack<T>::Stack です。

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

を出力する: - - :あなたは、図示のようにそれを行う

Constructing a `Stack<T>` 
Constructing a `Stack<T>` with `T` == `int` 
Constructing a `Stack<T>` with `T` == `std::string` 

Live demo

3

あなただけのクラスはテンプレートではなく、あなたのコンストラクタで、あなたは単にあなたがStack<char>のためにあなたのコンストラクタを専門にしたい場合は、それはあなたがどのように知りたい

template <> 
Stack<char>::Stack(int t){ /*...*/ } 
+1

しかし、データの種類ごとに異なるコンストラクタを作成する場合はどうすればよいですか?なぜなら、あなたが言ったことは、 '' Stack (int t); ''は大丈夫ではないということです。 – Homunculus

+0

その@Homunculusを拡張する必要があります。どのように違うの? – user4581301

+0

@ user4581301私のスタックがintの場合、コンストラクタは...(1)、またはstd :: stringが...(2)の場合は実行します。例としては、**文字列**のスタックの場合、コンストラクタはメモリを割り当てますが、** int **の場合はそうではありません。 – Homunculus

関連する問題