在学习《Essential C++》第四章做4.1、4.2练习题时,出现错误“error LNK2019: 无法解析的外部符号 "public: bool __thiscall Stack::push(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?push@Stack@@QAE_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z),该符号在函数 _main 中被引用D:\c\C++ learning\C++ learning\4.1.objC++ learning”
查了下代码,发现问题出现在关键字inline上,返回去重新看了inline的使用,发现忽略了“inline函数常常定义在头文件中”,也就是说,我将内联函数定义在“Stack.cpp”文件中,而非“Stack.h”。删除关键字“inline”即可解决问题。
出现这一错误,主要是因为在每个调用点上,编译器都需要取得其定义,因而必须将其定义在头文件中。
对于不属于类的函数来说,如果想将其定义为内联函数,但又又不想将内联函数写在头文件中,可以采用以下方法(方法来自百度百科:inline http://baike.baidu.com/link?url=37FG8wzzfZcxxjGbXaMZivrwhtaucBnllpIjJ6d_36efvu3IJUxkOaGI9M3xp5XkXcKAVdDl0Bq402Ou492uua):
定义一个头文件,这里命名为“Someinline.h”,其内容为:
#ifndef SOMEINLINE_H
#define SOMEINLINE_H
#include "Stack.cpp"//源文件扩展名根据编译器而定
#endif
inline Type Example(void);
//其他函数的声明
在CPP文件中,加入:
#include"SomeInline.h"
Type Example(void)
{
//..........
}
//...............其他函数的定义