0

我试图打印一个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;
}

我想问以下几点:

  • 为什么第一个不起作用,第二个起作用?
  • 为相同功能编写函数的替代方法是什么?PS我不希望在函数内部更改任何元素。我想这可以使用 for_each() 算法来完成。但我不确定如何为它编写谓词。
4

3 回答 3

4

你应该使用

typename std::vector<T>::const_iterator i;

使其工作(正如编译器在错误消息中告诉您的那样)。

const_iterator在第一种情况下是依赖于模板的名称,因此您必须使用关键字来消除歧义。

请点击 Joachim Pileborg 评论中的链接以获得很好的解释。

于 2013-10-18T07:53:41.283 回答
4

std::vector<T>::const_iterator是依赖名,需要typename在前面加上:

typename std::vector<T>::const_iterator i;

或者只是这样写:

for (auto it  = v.begin(); it != v.end(); ++it) {
    std::cout << *it << "  ";
}

或者

for (auto const& e : v) 
{
   cout << e << "\n";
}
std::cout << std::endl;

什么是依赖名称

以某种方式依赖于模板参数的名称。当然,任何明确包含模板参数的限定或非限定名称都是依赖的。此外,如果访问运算符左侧的表达式类型取决于模板参数,则由成员访问运算符(. 或 ->)限定的限定名称是依赖的。特别是,this->b 中的 b 在出现在模板中时是一个从属名称。最后,在 ident(x, y, z) 形式的调用中的标识符 ident 当且仅当任何参数表达式具有依赖于模板参数的类型时,它才是依赖名称。

于 2013-10-18T07:57:40.337 回答
2
  • 为什么第一个不起作用,第二个起作用?

因为你忽略了错误

typename std::vector<T>::const_iterator i;
^^^Use typename
  • 为相同功能编写函数的替代方法是什么?PS我不希望在函数内部更改任何元素。我想这可以使用 for_each() 算法来完成。但我不确定如何为它编写谓词。
struct foo{
    void operator()(const int &i) const{
        std::cout<<i<<"  ";
    }
}
for_each(v.begin(), v.end(),foo());
于 2013-10-18T07:59:56.617 回答