首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一上报错是什么原因

2012-10-21 
求助一下报错是什么原因在学习c++的模版的时候,照着书上的代码输的,报错是1main.obj : error LNK2019: un

求助一下报错是什么原因
在学习c++的模版的时候,照着书上的代码输的,报错是
  1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall Stack<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >::pop(void)" (?pop@?$Stack@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@@QAEXXZ) referenced in function _main
  后面还有几个类似的,比较长,百度说这种类型的错误是因为没有实现函数,但是好像都实现了。
  stack1.h

C/C++ code
#include <vector>#include <stdexcept>template <typename T>class Stack{private:    std::vector<T> elems;public:    void push(T const&);    void pop();    T top() const;    bool empty() const{return elem.empty();}};

stack1.cpp
C/C++ code
#include "stack1.h"template <typename T>void Stack<T>::push(T const& elem){    elems.push_back(elem);}template <typename T>void Stack<T>::pop(){    if(elems.empty())        throw std::out_of_range("Stack<>::pop: empty stack");    elems.pop_back();}template <typename T>T Stack<T>::top() const{    if(elems.empty())        throw std::out_of_range("Stack<>::pop: empty stack");    return elems.back();}

main.cpp
C/C++ code
#include "stack1.h"#include <iostream>#include <cstdlib>#include <string>using namespace std;int main(){    try    {        Stack<int> intStack;        Stack<string> strStack;        intStack.push(7);        cout<<intStack.top()<<endl;        strStack.push("hello");        cout << strStack.top()<<endl;        strStack.pop();        strStack.pop();    }    catch (exception const& ex)    {        cerr<<"Exception:"<<ex.what()<<endl;        return EXIT_FAILURE;    }}


[解决办法]
模板不能分开.h和.cpp,直接都放在一个stack1.h文件中即可,删除stack1.cpp:
C/C++ code
#include <vector>#include <stdexcept>template <typename T>class Stack{private:    std::vector<T> elems;public:    void push(T const&);    void pop();    T top() const;    bool empty() const{return elems.empty();}};template <typename T>void Stack<T>::push(T const& elem){    elems.push_back(elem);}template <typename T>void Stack<T>::pop(){    if(elems.empty())        throw std::out_of_range("Stack<>::pop: empty stack");    elems.pop_back();}template <typename T>T Stack<T>::top() const{    if(elems.empty())        throw std::out_of_range("Stack<>::pop: empty stack");    return elems.back();} 

热点排行
Bad Request.