C++ 如何声明放在main之后的类模板?

C++ 如何声明放在main之后的类模板?,c++,templates,C++,Templates,我试图实现一个模板类,它是堆栈。但我想在主机场前申报。我可以这样做吗?我知道如果你把main放在模板之后,它会编译,但是有可能先把main放在模板之后吗 #include <iostream> //start declaration of template template <class T> class stack<T>; //end declaration of template int main() { stack<char>

我试图实现一个模板类,它是堆栈。但我想在主机场前申报。我可以这样做吗?我知道如果你把main放在模板之后,它会编译,但是有可能先把main放在模板之后吗

#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;
    }
#包括
//模板的开始声明
模板
类堆栈;
//模板的结束声明
int main(){
堆栈s(5);
s、 推(a);
s、 推动('b');

cout你就快到了。语法是:

template <class T>
class stack;
模板
类堆栈;

但是,与任何类声明一样,如果您使用它需要完整的定义,那么它是不够的。实例化模板并使用其成员函数就是这样一种情况,所以这次您运气不好。

声明模板的正确语法是,正如昆汀已经指出的:

template <class T>
class stack;
模板
类堆栈;
但这对你没有帮助,因为:

是否可以先放置主模板,然后再放置模板

#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;
    }
只有在不使用
main
中的模板时,才能执行此操作


但是您确实使用了模板,所以不,您不能这样做。模板必须在实例化之前定义。但是,如果您愿意,您可以将成员函数的定义保留在
main
之后。

您为什么要这样做?我的老师让我这么做。@PatrykWertka这是一件非常有效的事情。为什么不是吗?因为,除了练习之外,知道这一点也没什么用。@PatrykWertka说类声明是无用的,这是一个非常大胆的说法:)如果我这样做,它会给我以下信息:classTemppers.cpp(10):错误C2079:'s'使用未定义的类'堆栈'
template <class T>
class stack;
template <class T>
class stack;