none
问一个关于头文件的小白问题 RRS feed

  • 问题

  • #include <iostream>
    #include <string>
    #include <cstdlib>
    
    #include "stack1.cpp"
    
    using namespace std;
    
    int main() {
    	try {
    		stack1<int> intStack;
    		stack1<string> stringStack;
    
    		intStack.push(7);
    		cout<<intStack.top()<<endl;
    
    		stringStack.push("Hello");
    		cout<<stringStack.top()<<endl;
    		stringStack.pop();
    		stringStack.pop();
    	} catch (exception const& ex) {
    		cerr<<"Excetion: "<<ex.what()<<endl;
    		return EXIT_FAILURE;
    	}
    
    	return 0;
    }

    如上面的代码,当我使用#include "stack1.cpp" 时,就能正确编译。但如果我使用 #include "stack1.h"时,就会产生如下的错误

    1>  Main.cpp
    1>Main.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall stack1<int>::stack1<int>(void)" (??0?$stack1@H@@QAE@XZ),该符号在函数 _main 中被引用
    1>Main.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall stack1<int>::~stack1<int>(void)" (??1?$stack1@H@@QAE@XZ),该符号在函数 _main 中被引用
    1>Main.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall stack1<int>::push(int const &)" (?push@?$stack1@H@@QAEXABH@Z),该符号在函数 _main 中被引用
    1>Main.obj : error LNK2019: 无法解析的外部符号 "public: int __thiscall stack1<int>::top(void)const " (?top@?$stack1@H@@QBEHXZ),该符号在函数 _main 中被引用
    1>Main.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall stack1<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >::stack1<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >(void)" (??0?$stack1@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@@QAE@XZ),该符号在函数 _main 中被引用
    1>Main.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall stack1<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >::~stack1<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >(void)" (??1?$stack1@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@@QAE@XZ),该符号在函数 _main 中被引用
    1>Main.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall stack1<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >::push(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?push@?$stack1@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z),该符号在函数 _main 中被引用
    1>Main.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall stack1<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >::pop(void)" (?pop@?$stack1@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@@QAEXXZ),该符号在函数 _main 中被引用
    1>Main.obj : error LNK2019: 无法解析的外部符号 "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall stack1<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >::top(void)const " (?top@?$stack1@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ),该符号在函数 _main 中被引用

    请问这是什么原因呢?

    2013年3月12日 12:24

答案

  • 目测你没有把stack1.cpp添加到工程中,导致该文件并没有生成obj文件,则在连接是无法找到实现。

    麻烦把正确答案设为解答。

    • 已标记为答案 NBU木木 2013年3月21日 7:17
    2013年3月21日 3:16
    版主

全部回复

  • 补充一下,在visual C++ 2012和2010中都会产生这样的问题,不知道是IDE本身还是什么别的原因
    2013年3月12日 12:25
  • 您stack1类的实现是怎么样的?用的是模板吗?我猜是因为模板定义和实现分离导致的问题吧。


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2013年3月13日 1:33
    版主
  • 目测你没有把stack1.cpp添加到工程中,导致该文件并没有生成obj文件,则在连接是无法找到实现。

    麻烦把正确答案设为解答。

    • 已标记为答案 NBU木木 2013年3月21日 7:17
    2013年3月21日 3:16
    版主
  • 我当然知道啊,为什么用#include "stack1.h"不行呢?在别的IDE里是可以的
    2013年3月21日 7:17
  • 模板函数的实现不能link,因为聚现过程是在编译阶段,所以如果你把stack地实现写到了 stack.cpp中,就一定要inlcude stack.cpp。

    麻烦把正确答案设为解答。

    2013年3月21日 9:52
    版主
  • 谢谢,好厉害的样子
    2013年4月1日 11:08