首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

简单的template程序,出现 error LNK2019解决思路

2012-02-05 
简单的template程序,出现 error LNK2019我在visual c++ express里写了一个很简单的程序,如下:[a.h]templat

简单的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 文件就不要了。
目前的多数编译器不支持模版的分离编译方式。

热点排行