1、error C2512: “HTable”: 没有合适的默认构造函数可用?
分析:一般自定义了构造函数之后,可能会出现这种错误;但是现在,HTable中并没有定义任何构造函数,它应该有默认构造函数的,为什么会报这个错误呢?
定位方法:
(1)手动添加了一个默认的构造函数HTable(){}; 现在出现了一个新的错误:error C2512: “List”: 没有合适的默认构造函数可用。
(2)错误原因找到了:HTable类中的一个成员变量List,实际上是List没有合适的默认构造函数。
2、error LNK2019: 无法解析的外部符号 "public: int __thiscall SymbolTable::add(char const *,int)" (?add@SymbolTable@@QAEHPBDH@Z),该符号在函数 "public: __thiscall FunctionTable::FunctionTable(class SymbolTable &,class FunctionEntry * const)" (??0FunctionTable@@QAE@AAVSymbolTable@@QAVFunctionEntry@@@Z) 中被引用
定位方法:这个实在不知道啥原因了,就在优快云上搜了一下。发现有很多原因会导致这个问题
(1)error LNK2019: 无法解析的外部符号,这种问题一般都是所用到的函数lib文件没有添加;
(2)凡是被定义的成员函数都必须有函数体,否则就会导致error LNK2019。
(3)当c++要调用c的函数库的时候,需要在要引用的c的头文件中添加
#ifdef __cpluscplus
extern "C" {
#endif
//c函数库的头文件或者声明的c函数库文件
#include "..."
#ifdef __cpluscplus
}
#endif
如果不这样做,就会产生error lnk2019的错误,原因是c++和c编译产生的外部符号不同
本次问题产生原因:
这次竟然就是在头文件中声明了add()这个函数,竟然没有定义(实现)它,所以导致了error LNK2019。
3、error C2678: 二进制“[” : 没有找到接受“const std::map<_Kty,_Ty>”类型的左操作数的运算符(或没有可接受的转换)
下面这段程序在访问编译总是报上面的错误
class GraphContext
{
public:
GraphContext()
{
for (char c = 'a'; c <='z'; c++)
{
_sizeMap[c] = c-32;
}
}
int getFontSize(char ch) const
{
return _sizeMap[&ch];
}
private:
std::map<char,int> _sizeMap;
};
原因出在getFontSize这个函数上面,将此函数声明为const,但是在函数里又引用了map[index],这种下标式的应用,是通过map<char,int>::iterator而不是map<char,int>::constiterator实现的,iterator是可以修改map的内容的,所以出错。
解决办法:
- 是去掉函数的const属性,但是这样就改变设计意义了
- 在声明_sizeMap时加上mutable限定符,如下所示
mutable std::map<char,int> _sizeMap;
- 不改变原来的声明,代码修改为:
int getFontSize(char ch) const
{
//return _sizeMap[&ch];
std::map<char,int>::const_iterator it = _sizeMap.find(ch);
if (it != _sizeMap.end())
{
return it->second;
}
return -1;
}
4、LINK : error LNK2001: 无法解析的外部符号 _mainCRTStartup
原因:出现这个错误的原因竟然是我不小心,把main函数写到.h里面去了。