2016-04-19 10 views
4

私はスタックのテンプレートクラスを実装しようとしています。しかし、私はメインの前にそれを宣言したい。それをしてもいいですか?テンプレートの後にメインを置くとコンパイルされますが、メインのテンプレートを最初に置くことは可能ですか?与えられたメインの後に配置されるクラステンプレートを宣言するにはどうすればよいですか?

#include <iostream> 


//start declaration of template 
template <class T> 
class stack<T>; 
//end declaration of template 
int main() { 

    stack<char> s(5); 
    s.push('a'); 
    s.push('b'); 
    cout <<s.pop()<<endl; 
    stack<double> s1(10); 
    s1.push(3.2); 
    s1.push(0.5); 
    cout << s1.pop()<<endl; 

    return 0; 
} 


template <class T> 
class stack { 
    T *s; 
    int size; //How many elements I can stole. 
    int top; //Where the index is available. 

public: 

    stack(int sz) { 
     size = sz; 
     s = new T[sz]; 
     top=-1; 
    } 

    void push(T e); 
    T pop() { 

     return s[top--]; 
    } 
}; 



template <class T> 
void stack<T>::push(T e) { 

     s[++top] = e; 
    } 

エラー:これをやってレコードの

1>.\classTemplPers.cpp(6) : error C2143: syntax error : missing ';' before '<' 
1>.\classTemplPers.cpp(6) : error C2059: syntax error : '<' 

、:

template <class T> 
class stack; 

はどちらか動作しません。このようなエラーが表示されます:

1>.\classTemplPers.cpp(10) : error C2079: 's' uses undefined class 'stack<T>' 
+0

なぜあなたはそれをしたいですか? –

+1

私は先生からそれをやることを任されました。 –

+1

@PatrykWertkaこれは完全に有効なことです。それはなぜでしょうか? – Quentin

答えて

3

クエンティンは、すでに指摘したように、テンプレートを宣言するための正しい構文は、ある

が、その後、メイン1を置くことが可能ですテンプレート?

mainでテンプレートを使用していない場合にのみ可能です。

しかし、テンプレートを使用するので、できません。テンプレートは、インスタンス化する前に定義する必要があります。ただし、希望する場合は、mainの後にメンバー関数の定義を残すことができます。

2

あなたはほぼあります。構文は次のとおりです。

template <class T> 
class stack; 

しかし、どのようなクラス宣言でも、完全な定義が必要なクラスはありません。テンプレートをインスタンス化し、そのメンバ関数を使用することはこのような場合の1つで、今回は不運になります。

template <class T> 
class stack; 

しかしので、それはあなたを助けにはなりません:

+0

私はこれを私に与えます: –

+0

classTemplPers.cpp(10):エラーC2079: 's'は未定義クラス 'stack 'を使用します。 –

関連する問題