学习C++

在编写template函数时,出现iterator对象,必须采用如下格式声明iterator。

typename container::iterator iter=container.begin();

没有加typename使我调试了半天都不知道为啥错误,Essential C++上对于template中使用vector的iterator前边并没有加typename,汗…

部分编译器接受未加typename的iterator声明,但这种程序的可移植性差,不安全。

以下引子Effective STL(Scott Myers)

为了避免潜在的解析含糊(我将提供给你细节),你被要求
在依赖形式类型参数的类型名字之前使用typename。这样的类型被称为依赖类型,
一个例子将帮助阐明我所说的。假设你想为函数写一个模板,给定一个STL容器,
返回容器中的最后一个元素是否大于第一个元素。这是一种方法:

template<typename C>
bool lastGreaterThanFirst(const C& container)
{
if (container.empty()) return false;
typename C::const_iterator begin(container, begin());

typename C::const_ierator end(container.end());

return *--end > *begin;
}

在这个例子里,局部变量begin和end的类型是C::const_iterator。const_iterator是依赖
形式类型参数C的一种类型。因为C::const_iterator是一种依赖类型,你被要求在它之前放上
typename这个词。(一些编译器错误地接受没有typename的代码,但这样的代码不可移植。)

转载请注明来源:Leoncom-《学习C++》
Trackback

no comment untill now

Add your comment now