模版声明和定义与顺序有关吗?
当我在C++ DEV上编译C++ primer Plus v5 实例8.13的时候发现模版声明和定义的顺序有关。下面是可以编译通过的代码。但是当我把template <class Any> void Swap(Any &a, Any &b);声明放到template <> void Swap<job> (job &j1, job &j2);后面之后,编译就不能通过了。报错是:
template <> void Swap<job> (job &j1, job &j2) -- expected init-declarator before '<' token
template <> void Swap<job> (job &j1, job &j2) -- expected ';' before '<' token
template <> void Swap<job>(job &j1, job &j2)
{ -- specialization of void Swap(Any &, Any &)[with Any=job] after instantiation
这是为何?难道现模版声明和定义的顺序有关吗?
#include<iostream>
template <class Any>
void Swap(Any &a, Any &b);
struct job
{
char name[40];
double salary;
int floor;
};
template <> void Swap<job> (job &j1, job &j2);
void Show(job &j);
int main()
{
.......
}
template <class Any>
void Swap(Any &a, Any &b)
{
Any temp;
temp = a;
a = b;
b = temp;
}
template <> void Swap<job>(job &j1, job &j2) // specialization
{
double t1;
int t2;
t1 = j1.salary;
j1.salary = j2.salary;
j2.salary = t1;
t2 = j1.floor;
j1.floor = j2.floor;
j2.floor = t2;
}
void Show(job &j)
{
using namespace std;
cout << j.name << ": $" << j.salary << " on floor " << j.floor << endl;
}