模板类、模板函数声明定义在一起

模板函数、模板类声明和定义要放在一起,不要再.h中声明了,然后再.cpp中定义,这要编译器再链接时会提示找不到函数或类的标识符。

这是因为编译时是以文件为基础逐个文件编译的。对于普通的函数,如果定义在.h,实现在.cpp文件,程序在执行的时候可以通过.h文件找到函数在.cpp文件中的定义,可以执行。

** 但是模板函数如果定义在.h,实现在.cpp文件, 程序在执行的时候找不到函数的实现——不知道模板函数中的类型到底是什么,所以提示找不到标识符之类的错误 **

模板函数

  • 定义:

    1
    2
    3
    4
    templete <class\typename T> 返回类型 函数名(包含类型T的参数列表)
    {
    函数主体;
    }
  • 使用:

    1
    函数名(参数列表)
  • 例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    template<class T> T add(const T& a, const T& b)
    {
    return a + b;
    }

    int main(void)
    {
    int a = 1;
    int b = 2;
    cout << add(a, b) << endl;
    float n1 = 3.0;
    float n2 = 4.5;
    cout << add(n1, n2) << endl;
    system("pause");
    return 0;
    }

    模板类

  • 定义:

    1
    2
    3
    template <class\typename T> class 类名{
    类定义
    };
  • 类外声明成员函数

    1
    2
    template <class T>
    返回类型 类名<T>::函数名(参数){定义}

    如果返回类型是类对象,形式为 :类名,而不只是类名

  • 使用——实例化对象:

    1
    类名<数据类型(可以是自定义类型也可以是基本类型)> 对象名;
  • 注意

在定义成员函数的时候,不能使用参数列表赋值

  • 例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void test1()
{
int n = 10;
ForTest<int> t1(n);
cout << t1.get() << endl;
t1.set(20);
cout << t1.get() << endl;
}
int main(void)
{
test1();

test t1(1), t2(2);
cout << t1.get() << " " << t2.get() << endl;

SmPt<test> s1(test(1));
SmPt<test> s2 (s1);
s1.get()->set(10);
cout << *s1.get() << endl;
cout << *s2.get() << endl;

system("pause");
return 0;
}
  • 模板类声明为其他类的友元类

那么在其他类中,需要这么写:

1
template<class\typename T> friend class 模板类名


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!