[英]C++:Use user-defined generic functions
我现在正在阅读《C++ Standard Library》。我发现第 5.7 章有些混乱。 我们知道,我们可以编写自己的函数和算法来处理collections的元素。当然这些操作也可以是泛型的。 让我们看一个例子。下面的代码定义了一个通用的 function,它打印一个可选的字符串,后跟传递的容器的所有元素。
template <class T>
inline void PRINT_ELEMENTS(const T& col1,const char *optcstr = "")
{
typename T::const_iterator pos;
for(pos = col1.begin();pos != col1.end();++pos)
cout << *pos << " ";
cout << endl;
}
并且 pos 被声明为具有传递的容器类型的迭代器类型,需要使用typyname来指定 const_iterator 是一个类型而不是类型 T 的值。
我有几个问题:
(1)当我在代码中擦除typename时,效果很好。 请参阅以下代码:
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
int square (int value)
{
return value*value;
}
template <class T>
inline void PRINT_ELEMENTS(const T& col1,const char *optcstr = "")
{
/*typename T::const_iterator pos;*/
T::const_iterator pos;
for(pos = col1.begin();pos != col1.end();++pos)
cout << *pos << " ";
cout << endl;
}
int main()
{
set<int> coll1;
vector<int> coll2;
// insert elements from 1 to 9 into coll1
for (int i=1; i<=9; ++i) {
coll1.insert(i);
}
/*PRINT_ELEMENTS(coll1,"initialized: ");*/
// transform each element from coll1 to coll2
// - square transformed values
transform (coll1.begin(),coll1.end(), // source
back_inserter(coll2), // destination
square); // operation
PRINT_ELEMENTS(coll2,"squared: ");
}
它运作良好。它的 output 是:
为什么?不需要typename吗? 而且这里的function我不是很懂。 有人可以给我翻译吗?
(2)为什么我不能使用vector::iterator来对output这样的元素:
#include <iostream>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
set<int> intSet;
vector<int> intVector2;
for (int i = 1;i <= 10;++i)
intSet.insert(i);
transform(intSet.begin(),intSet.begin(),
back_inserter(intVector2),
negate<int>());
vector<int>::iterator iter = intVector2.begin();
for(;iter != intVector2.end();++iter)
cout << *iter << endl;
}
它什么都不输出。我使用 Visual Studio 2008 来运行我的代码。 有人可以帮我吗?非常感谢。
typename
不是必需的,因为某些版本的 Visual Studio 不符合标准。 较新的版本和其他编译器对此更加严格,如果没有它,您的代码将无法在那里编译。
您的第二个示例不起作用,因为您通过了begin()
和begin()
,而不是begin()
和end()
。
transform(intSet.begin(),intSet.begin(),
哎呀。
(1)
typename 在某些情况下有助于消除其操作数作为类型的歧义。
最突出的似乎是在 class 声明的 scope 中:
class X
{
...
typename Y::Z w; // necessary
};
(2)
有错别字...
- transform(intSet.begin(),intSet.begin(),
back_inserter(intVector2),
negate<int>());
+ transform(intSet.begin(),intSet.end(),
back_inserter(intVector2),
negate<int>());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.