编译链接错误

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里面去了。
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值