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

时间:2009-11-28 15:26:25

标签: c++

以下内容基于我在this thread上发布的代码。除了明显的错误,我得到以下编译错误?知道为什么吗?

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

情景A:

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

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

情景B:

我收到编译错误“错误C2664:'_ _ thistall StdVector :: StdVector(const class StdVector&amp;)':无法将参数1从'class StdVector(__cdecl *)(void)'转换为'const class StdVector&amp;'“代码如下:

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

情景C:

我收到编译错误“错误LNK2001:未解析的外部符号”public:__ thistall StdVector :: ~StdVector(void)“(?? 1?$ StdVector @ H @@ QAE @ XZ) “对于以下代码:

StdVector<int> a;

4 个答案:

答案 0 :(得分:4)

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

这些是函数声明。省略括号以声明默认构造的实例。

答案 1 :(得分:1)

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

StdVector<int> a;

答案 2 :(得分:1)

正如之前的答案所说,在场景A和B中,您实际上是在声明函数而不是实例化对象实例。这被称为“C ++最令人烦恼的解析”。有关详细讨论,请参阅this question

如果没有看到类的实际源代码,很难说为什么场景C不起作用,但是链接器告诉你它无法找到StdVector的析构函数。它表示它是一个“未解析的外部符号”,这意味着在编译时它没有定义,它或者假定或明确告知定义在其他文件中。当将所有目标文件链接到单个可执行文件时,它无法找到析构函数的目标代码,这就是您收到该错误的原因。这并没有为您提供解决问题的简单方法,但至少您知道从哪里开始寻找。

答案 3 :(得分:1)

如果我没弄错的话,模板无法导出。这就是我在场景C中收到链接器错误的原因。