读书人

简单的template程序出现 error LNK2

发布时间: 2012-02-05 12:07:14 作者: rapoo

简单的template程序,出现 error LNK2019
我在visual c++ express里写了一个很简单的程序,如下:
[a.h]
template< class Type > class MyArray
{
private:
int _size;
public:
MyArray(int);
};

[a.cpp]
#include "array_template.h"

template< class Type >
MyArray< Type >::MyArray(int size)
{
_size = size;
}

[main.cpp]
#include "array_template.h"
int main()
{
MyArray< int > aaa(100);
}

a.h放在“Header Files”文件夹里;a.cpp和main.cpp放在“Source Files”文件夹里,编译的时候出现问题:

Linking...
main.obj : error LNK2019: unresolved external symbol "public: __thiscall MyArray<int>::MyArray<int>(int)" (??0?$MyArray@H@@QAE@H@Z) referenced in function _main
C:\Users\liming\Documents\Visual Studio 2008\Projects\array_learning\Debug\array_learning.exe : fatal error LNK1120: 1 unresolved externals


不明白为什么这个样子。我试了把MyArray()这个构造函数都写在a.h里时,可以正常编译成功;可是一旦分开在两个文件里,就出现上面的找不到"unresolved external symbol"这个信息,不知道为什么。

请指点指点,谢谢!

[解决办法]
C++深层探索上讲的:

template 有弊端
就是 他的实现部分必须和声明部分在一起

你声明在一个头文件
定义在另一个头文件

编译器笨,它根本就找不到

///只要你把实现部分拷贝到你声明的头文件,就没有错了

[解决办法]
将[a.cpp]
的内容复制到a.h
因为你的编译器不支持 模板分离编译
[解决办法]
不大熟
up一下
[解决办法]
MyArray < int > aaa(100);
这个的执行首先用int类型实例化MyArray模板,得到一个名字叫MyArray<int>的类型,然后用这个类型定义变量
aaa;实例化的时候需要看到整个模板的定义

[解决办法]
本来 export就可以的
但是编译器都没有实现这个语言特性,所以只能把CPP文件放到H文件中。
[解决办法]
在《C++ Template》里面讲,模板是编译两次的。第一次是检查声明的语法上是否正确;第二次是检查模板参数的型

别是否匹配,以及型别是否支持模板的操作。

我觉得是这两次编译导致的链接问题吧,但不确定,如果有知道准确答案的兄弟,麻烦给讲一下。


[解决办法]
只要你在main.cpp的文件中需要包含实现文件,用#include ".\array_template.cpp"取代#include "array_template.h"就行了
[解决办法]
你的编译器不支持模板的分离。

模板是在你使用时,既你的语句MyArray<int> aaa(100);
时才取生成int版本的,

此时main里只有array_template.h,所以生成的只有int版本的声明,并没有实现。

解决方法就是把cpp的实现,拷贝到h里。

这里并不会有二次编译的问题。
因为开始编译时,编译器遇到template并不会去为其分配空间。
只有使用时,才会去实例化。


[解决办法]
因为你的编译器不支持 模板分离编译,这是原因所在,老多编译器都有这种缺陷,你看看标准库都是编译在 一块的
只要编译在一起就没问题了应该。
[解决办法]
[a.h]
template < class Type > class MyArray
{
private:
int _size;
public:
MyArray(int);
};

#include "array_template.h"

template < class Type >
MyArray < Type >::MyArray(int size)
{
_size = size;
}


a.cpp 文件就不要了。
目前的多数编译器不支持模版的分离编译方式。

读书人网 >C++

热点推荐