【问题标题】:syntax for declaring a function template声明函数模板的语法
【发布时间】:2011-12-12 08:18:52
【问题描述】:

我正在尝试创建一个模板函数,该函数接受任何类型 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 >&)'中: 错误:预期的';'在'我'之前 | 错误:'i' 未在此范围内声明 === 构建完成:2 个错误,0 个警告 ===

我是否忽略了语法错误?

【问题讨论】:

    标签: c++ templates containers


    【解决方案1】:

    尝试以下方法:

      typename vector<T>::const_iterator i;
    

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

    【讨论】:

    • 问题在于const_iterator 是一个从属名称 - 您可以在此处阅读更多信息:stackoverflow.com/questions/610245
    • “模板的依赖名”很容易误导,const_iteratora依赖名。
    【解决方案2】:

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

    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());
    }
    

    【讨论】:

    • 不完全是我想要的,但为未来的努力着想:)
    猜你喜欢
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多