添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

C++Primer第5版16.1.3节练习(模板参数)

练习16.17:声明为typename的类型参数和声明为class的类型参数有什么不同(如果有的话)?什么时候必须使用typename?

答: 声明为typename的类型参数和声明为class的类型参数没什么不同,但使用typename更能够见名知意。

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

练习16.18:解释下面每个函数模板声明并之处它们是否非法。更正你发现的每个错误。

(a) template <typename T, U, typename V> void f1(T, U, V);
(b) template <typename T> T f2(int &T);
(c) inline template <typename T> T foo(T,unsigned int*);
(d)template <typename T> f4(T,T);
(e) typedef char Ctype;
    template <typename Ctype> Ctype f5(Ctype a);

答:更正:

(a) template <typename T, typename U, typename V> void f1(T, U, V);
(b) template <typename T> T f2(T& t);
(c) 模板定义时才使用Inline
(d)template <typename T> void f4(T,T);//指定函数模板返回类型

练习16.19:编写函数,接受一个容器的引用,打印容器中的元素。使用容器的size_type和size成员来控制打印元素的循环。

答:

#include<iostream>
#include<vector>
#include<iostream>
template<typename T>
void my_print(const T& t)
	typename T::size_type size_type;
	for (size_type = 0; size_type < t.size(); ++size_type)
		std::cout << t[size_type] << " ";
	std::cout << std::endl;
int main()
	std::vector<int> vec1 = { 0,1,2,3,4,5,6,7,8,9 };
	my_print(vec1);
	return 0;
}

练习16.20:重写上一题的函数,使用begin和end返回的迭代器来控制循环。

答:

#include<iostream>
#include<vector>
#include<iostream>
template<typename T>
void my_print(const T& t)
	for (auto iter=t.begin(); iter != t.end(); ++iter)
		std::cout << *iter << " ";
	std::cout << std::endl;
int main()