大家好,又见面了,我是你们的朋友全栈君。
小弟是刚刚加入c++大队的,对c++中的基本知识只是稍微懂一点。今天在看《c++ primer》中的模板类时,就将其中的程序在vs 2008中写下,新建了Array.h和Array.cpp两个文件。
主函数:
Main.cpp
#include
“
stdafx.h
“
2
#include
<
iostream
>
3
#include
“
Array.h
“
4
5
using
namespace
std;
6
int
main(
int
argc,
char
*
argv[])
7
{
8
Array
<
char
>
array;
9
cout
<<
array.size()
<<
endl;
10
11
char
z;
12
cin
>>
z;
13
return
0
;
14
}
15
16
头文件:
Array.h
#pragma
once
2
3
4
template
<
class
elemType
>
5
class
Array
6
{
7
public
:
8
9
explicit
Array(
int
sz
=
DefaultArraySize);
10
Array(Array
<
elemType
>
*
array ,
int
array_size);
11
Array(
const
Array
&
rhs);
12
13
~
Array(
void
);
14
15
//
判断是否相等操作
16
bool
operator
==
(
const
Array
&
)
const
;
17
bool
operator
!=
(
const
Array
&
)
const
;
18
19
//
赋值操作符
20
Array
&
operator
=
(
const
Array
&
);
21
int
size()
const
{
return
_size;};
22
23
elemType
&
operator
[](
int
index);
24
void
sort();
25
elemType min();
26
elemType max() ;
27
//
************************************
28
//
Method: find
29
//
FullName: IntArray::find
30
//
Access: public
31
//
Returns: int
32
//
Qualifier:查找数组中是否存在特定的值。
33
//
Parameter: int value
34
//
************************************
35
int
find(
const
elemType
&
value);
36
protected
:
37
void
Init(
int
sz,elemType
*
array);
38
39
private
:
40
static
const
int
DefaultArraySize
=
12
;
41
int
_size;
42
elemType
*
ia;
43
bool
sorted;
44
};
45
Array头文件的实现:
Array.cpp
#include
“
StdAfx.h
“
2
#include
“
Array.h
“
3
#include
<
cassert
>
4
5
template
<
class
elemType
>
Array
<
elemType
>
::Array(
int
sz)
6
{
7
Array
<
elemType
>
::Init(sz,
0
);
8
}
9
10
11
template
<
class
elemType
>
Array
<
elemType
>
::Array(Array
<
elemType
>
*
array ,
int
array_size)
12
{
13
Array
<
elemType
>
::Init(array_size,array);
14
}
15
16
17
template
<
class
elemType
>
Array
<
elemType
>
::Array(
const
Array
<
elemType
>
&
rhs)
18
{
19
Array
<
elemType
>
::Init(rhs.size(),rhs.ia);
20
}
21
22
template
<
class
elemType
>
Array
<
elemType
>
::
~
Array(
void
)
23
{
24
delete []ia;
25
std::cout
<<
“
析构函数作用中。。。。。
“
<<
std::endl;
26
}
27
template
<
class
elemType
>
28
void
Array
<
elemType
>
::Init(
int
sz,elemType
*
array)
29
{
30
_size
=
sz;
31
ia
=
new
elemType[_size];
32
sorted
=
false
;
33
34
for
(
int
ix
=
0
;ix
<
_size;
++
ix)
35
{
36
if
(
!
array)
37
ia[ix]
=
0
;
38
else
39
ia[ix]
=
array[ix];
40
}
41
}
42
template
<
class
elemType
>
43
elemType
&
Array
<
elemType
>
::
operator
[](
int
index)
44
{
45
assert(index
>
0
||
index
<
size());
46
return
ia[index];
47
}
48
49
50
//
************************************
51
//
Method: find
52
//
FullName: IntArray::find
53
//
Access: public
54
//
Returns: int
55
//
Qualifier:查找数组中是否存在特定的值。
56
//
Parameter: int value
57
//
************************************
58
template
<
class
elemType
>
59
int
Array
<
elemType
>
::find(
const
elemType
&
value)
60
{
61
for
(
int
ix
=
0
;ix
<
_size;
++
ix)
62
{
63
if
(ia[ix]
==
value)
64
return
ix
+
1
;
65
}
66
}
67
template
<
class
elemType
>
68
elemType Array
<
elemType
>
::max()
69
{
70
return
ia[
0
];
71
}
72
73
template
<
class
elemType
>
74
elemType Array
<
elemType
>
::min()
75
{
76
return
ia[size()
–
1
];
77
}
78
79
template
<
class
elemType
>
80
void
Array
<
elemType
>
::sort()
81
{
82
elemType temp;
83
//
如果已经排序,返回。
84
if
(sorted)
85
return
;
86
87
for
(
int
i
=
0
;i
<
size()
–
1
;
++
i)
88
{
89
for
(
int
j
=
1
;j
<
size()
–
i;
++
j)
90
{
91
if
(ia[i]
<
ia[j])
92
{
93
temp
=
ia[j];
94
ia[j]
=
ia[i];
95
ia[i]
=
temp;
96
}
97
}
98
}
99
100
101
//
设置为以排序。
102
sorted
=
true
;
103
}
104
105
但是在编译的时候vs 2008提示“错误 1 error LNK2019: 无法解析的外部符号 “public: __thiscall Array<char>::~Array<char>(void)” (??1?$Array@D@@QAE@XZ),该符号在函数 _main 中被引用 Esonion.obj Esonion” 。
到网上找了好久,才找到原来是vs 2008不支持模板定义和实现分离。将Array.cpp的内容拷贝到Array.h中,在编译就可通过了。我在c-free中试了,也是不可以。看来这两个编译器都不支持模板定义和实现分离。
特意记下来,c++学习路上的一个脚印。
转载于:https://www.cnblogs.com/mht_two/archive/2010/10/10/1847338.html
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/144585.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...