以下内容基于我在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;
答案 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中收到链接器错误的原因。