声明函数模板的语法

时间:2011-12-12 08:18:52

标签: c++ templates containers

我正在尝试创建一个模板函数,它接受任何类型的T参数(现在是原语)并打印出其内容:

template<class T>
void displayContents(const vector<T>& data)
{
    vector<T>::const_iterator i;
    i=data.begin();

    for( ; i!=data.end(); i++){
        cout<<*i<endl;
    }
}

错误消息是:

  

在函数'void displayContents(const std :: vector&gt;&amp;)'中:   错误:预期';'在'我'之前   错误:'i'未在此范围内声明   ===构建完成:2个错误,0个警告===

我是否忽略了语法错误?

2 个答案:

答案 0 :(得分:5)

尝试以下方法:

  typename vector<T>::const_iterator i;

正如Björn在评论中已经指出的那样,它是必需的,因为它是模板的从属名称。

答案 1 :(得分:3)

如果您的目标是输出每个元素,则不应将自己约束为向量。惯用的通用解决方案是传递两个迭代器:

template<typename ForwardIterator>
void display_contents(ForwardIterator begin, ForwardIterator end)
{
    for (ForwardIterator it = begin; it != end; ++it)
    {
        std::cout << *it << '\n';
    }
}

然后你可以使用带有向量,集合和几乎所有其他容器的模板:

int main()
{
    std::vector<int> a {2, 3, 5, 7};
    display_contents(a.begin(), a.end());

    std::set<int> b {11, 13, 17, 19};
    display_contents(b.begin(), b.end());
}