无法在c ++中创建模板<typename t =“”> vector <t> :: iterator </t> </typename>

时间:2014-05-02 15:48:13

标签: c++ stl iterator

template<typename T>
bool Palindrome(vector<T> word) {
vector<T>::iterator start = word.begin();
vector<T>::iterator end = word.end();
for (;start != (word.begin() + word.end())/ 2;start++) {
    if (*start != *(--end)) {
        return false;
    }
}
return true;
}

我无法创建代码第3行的迭代器。我必须为任何数据类型制作回文检查器。是否有关于语法的问题或我们不能这样做。谢谢!

错误消息如下:

'end'未在此范围内声明 在此范围内未声明'start' dependent-name'std :: vector :: iterator'被解析为非类型,但实例化产生类型
dependent-name'std :: vector :: iterator'被解析为非类型,但实例化会产生一个类型 预期';'在'结束'之前 预期';'在'开始'之前 在'std :: vector :: iterator'之前需要'typename',因为'std :: vector'是一个依赖范围 在'std :: vector :: iterator'之前需要'typename',因为'std :: vector'是一个依赖范围 'operator /'不匹配(操作数类型为'__gnu_cxx :: __ normal_iterator&gt;'和'int')

2 个答案:

答案 0 :(得分:0)

尝试以下

template<typename T>
bool Palindrome( const std::vector<T> &word ) 
{
    typename std::vector<T>::const_iterator start = word.begin();
    typename std::vector<T>::const_iterator end   = word.end();

    for ( ; start < word.begin() + word.size() / 2; ++start ) 
    {
        if ( *start != *--end ) return false;
    }

    return true;
}

这是一个测试

#include <iostream>
#include <iomanip>
#include <vector>

template<typename T>
bool Palindrome( const std::vector<T> &word ) 
{
    typename std::vector<T>::const_iterator start = word.begin();
    typename std::vector<T>::const_iterator end   = word.end();

    for ( ; start < word.begin() + word.size() / 2; ++start ) 
    {
        if ( *start != *--end ) return false;
    }

    return true;
}

int main() 
{
    std::vector<int> v = { 1, 2, 1 };

    std::cout << std::boolalpha << Palindrome( v ) << std::endl;

    v = { 1, 2, 3 };

    std::cout << std::boolalpha << Palindrome( v ) << std::endl;

    v = { 1, 2, 2, 1 };

    std::cout << std::boolalpha << Palindrome( v ) << std::endl;

    return 0;
}

输出

true
false
true

答案 1 :(得分:0)

使用typename

typename vector<T>::iterator start = word.begin();