你真的尝试过这段代码吗?在gcc上稍加修改后,它可以正常工作。需要将
std::vector<T>::const_iterator
声明为
typename std::vector<T>::const_iterator
。
你最好使用std::copy和std::ostream_iterator。
编辑:
类型、相关类型和typename
无法在评论中全部展开,所以我来解释一下(顺便说一句,这是我的理解,如果有偏差请指出!)...
我认为最好用一个简单的例子来解释。
假设你有一个函数foo。
template <typename T>
void foo()
{
T::bob * instofbob; // this is a dependent name (i.e. bob depends on T)
};
看起来还不错,通常你可以这样做
class SimpleClass
{
typedef int bob;
};
并调用
foo<SimpleClass>(); // now we know that foo::instofbob is "int"
再次强调,这似乎很容易理解,但是有些用户会做出以下操作:
class IdiotClass
{
static int bob;
};
现在
foo<IdiotClass>(); // oops,
现在您拥有的是一个表达式(乘法),因为IdiotClass :: bob解析为非类型!对于人类来说,这显然是愚蠢的,但编译器无法区分类型和非类型,默认情况下,在C++中(我认为这是编译器之间的区别),
所有合格的依赖名称(即T :: bob)将被视为非类型。要明确地告诉编译器依赖名称是真实类型,您必须指定typename 关键字-
template <typename T>
void foo()
{
typedef typename T::bob *instofbob;
};
即使是 typedef
,也适用此规则。
template <typename T>
void foo()
{
typedef typename T::bob local_bob;
};
这更清楚了吗?
for (auto &i : vec) {}
可以使代码更短。 - C.W.for(const auto&i:vec)
才能通过编译。 - Walter