C++:自定义编码通用容器的编译错误?

问题描述:

以下是基于我发布在this thread上的代码。除了明显的错误之外,我还会遇到以下编译错误?任何想法为什么?C++:自定义编码通用容器的编译错误?

奇怪的是,这只发生在模板类。如果我将另一个非模板类添加到模板类的相同.h和.cpp文件中,并试图仅实例化非模板类,则不会生成错误。

情形A:

我得到的编译错误 “错误C2659: '=':重载的函数作为左操作数” 为以下代码:

StdVector<int> a(); 
StdVector<int> b(); 
a = b; 

情形B:

我得到的编译错误“错误C2664: '__thiscall StdVector :: StdVector(常量类StdVector &)':不能转换从参数1 '类StdVector(__cdecl *)(无效)' 来'常量类StdVector &' “为下面的代码:

StdVector<int> a(); 
StdVector<int> b(a); 

方案C:

我得到的编译错误” 错误LNK2001:无法解析的外部符号“公用:__thiscall StdVector ::〜StdVector(无效) “(?? 1 $ StdVector 3 H @@ @ QAE XZ)?” 为以下代码:

StdVector<int> a; 

如果我没有弄错,模板不能导出。这就是为什么我在方案C中收到链接器错误。

StdVector<int> a(); 
StdVector<int> b(); 

帖e是函数声明。省略括号来声明一个默认构造的实例。

您正在声明a和b是返回StdVector的函数。我认为这不是你想要的。将函数分配给函数意味着什么?也许你的意思是:

StdVector<int> a; 
+0

我试着对你提出的建议进行编辑后发现错误。 – Lopper 2009-11-28 15:37:48

由于以前的答案都表示,在A和B假想你实际上声明函数,而不是实例化对象实例。这被称为“C++最令人头痛的解析”。有关更多讨论,请参阅this question

这是很难说为什么场景C不没有看到实际的源代码,你的类工作,但链接告诉你,这是无法找到StdVector析构函数。它说这是一个“无法解析的外部符号”,这意味着编译时它没有定义,并且它假设或明确告知定义在其他文件中。当将所有目标文件链接到单个可执行文件时,它无法找到析构函数的目标代码,这就是为什么你会得到这个错误。这并不能给你一个简单的解决方案,但至少你有一个想法从哪里开始寻找。

+0

我强烈怀疑这是由于VC++ 6编译器在虚拟环境下运行所致。会证实这一点! – Lopper 2009-11-29 00:37:41