c++随笔,关于模板的第二个小记 16.1.3模板参数

16.1.3模板参数

很多时候我们把参数名字定义为T,但是实际上我们可以使用任何的名字

比如

template <typename DATA>using partNo = BlobA<DATA>;

模板参数和作用域规则。一个模板参数名的可用范围是在其声明之后,至模板声明或定义结束之前。与其他任何名字都一样,模板参数会隐藏外层作用域中声明的相同的名字。但是,与大多数其他上下文相同,在模板内不能重用模板参数名:

typedef double A;
template <typename A,typename B>void f(A a,B b)
{
    A tmp = a;
    double B;//错误重复声明模板参数B
}

因为上面已经声明过B 了 typename B,下面又声明了B
同时也要注意temp 的类型 不是 double 了 ,是模板的实参类型

模板声明:

模板声明必须包含模板参数

template <typename T> int compare(const T&, const T&);
template <typename T> class Blob;

与函数一样,声明中的模板名字,不一定要和定义的时候相同

template <typename T> T calc(const T&,const T&);
template <typename U> U calc(const U&,const U&);

比如说这两个模板函数其实就是一样的这么写会出现重复定义

使用类的类型成员

比如说我们可以使用string::size_type ,我们知道string类型,但是对于模板T::mem来说,却不知道T的类型

默认情况下,c++语言假定通过作用域运算符访问的名字不是类型。因此如果我们希望使用一个模板类型参数的类型成员,就必须显示的告诉编译器该名字是一个类型。我们通过使用typename来实现这一点。

template <typename T>
typename T::value_type top(const T&c)
{
    if(!c.empty())
        return c.back();
    else
        return typename T::value_type();
}

我们的top函数期待一个容器类型的实参,它使用typename指明返回类型并且在c中没有元素时候生成一个值初始化的元素返回给调用者。

然后我们看代码

int main()
{
    int b;
    std::vector<int> vec;
    top(vec);
//    std::cout<<partNo<int>::count()<<std::endl;
    return 0;
}

如果传入 vec这是正确的 如果传入 a 因为是int所以是错误的这全都归功与我们提前告知了编译器

猜你喜欢

转载自blog.csdn.net/qq_32783703/article/details/104601574