【发布时间】:2013-10-18 07:49:38
【问题描述】:
我试图使用如下辅助函数打印vector<int>:
这不起作用 -
template<class T>
void print(const std::vector<T>& v)
{
std::vector<T>::const_iterator i;
for (i = v.begin(); i != v.end(); i++)
std::cout << *i << " ";
std::cout << std::endl;
}
编辑:我明白了。
但这有效 -
template<class T>
void print(const std::vector<T>& v)
{
// changed std::vector<T> to std::vector<int>
std::vector<int>::const_iterator i;
for (i = v.begin(); i != v.end(); i++)
std::cout << *i << " ";
std::cout << std::endl;
}
我想问以下问题:
- 为什么第一个不起作用,第二个起作用?
- 有哪些替代方法可以为相同的功能编写函数? 附言我不希望在函数内部更改任何元素。我想这可以使用 for_each() 算法来完成。但我不确定如何为其编写谓词。
【问题讨论】:
-
如果你想使用
int,可以将class T替换为typename T -
哦,请尝试阅读错误消息。它实际上准确地说明了您必须做些什么来修复它。
-
@arne 老实说,我已经编写大量模板代码已有 4 年了,这是我第一次听到这种区别。我已经学会在任何地方都支持
class,因为它不能与表示非类型模板参数的typename混淆。 -
恭喜。你截取了文字。
-
我更喜欢像对待成年人一样对待我的同事,并假设读者知道他们在读什么,即知道
class和typename在这种情况下是可以互换的。如果他们不这样做,他们就没有阅读该代码的业务,并且将重新阅读那本教授模板的书,并且永远不会感到困惑。