2014-05-02 58 views
0
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。我必须为任何数据类型制作一个回文检查器。有没有关于语法的问题,或者我们不能这样做。谢谢!无法创建模板<typename T>矢量<T> ::迭代器,C++

错误消息是如下:

“结束”在此范围 “开始”未声明没有被在该范围内声明
从属名“的std ::矢量:迭代”被解析作为非类型,但实例化产生一个类型
依赖名称'std :: vector :: iterator'被解析为非类型,但实例化产生一个类型 预期';'在'结束'之前
预期';' 'std :: vector :: iterator'之前需要'typename',因为'std :: vector'是一个依赖范围 'std :: vector :: iterator'之前需要'typename',因为'std ::向量”是一个依赖范围 敌不过 '操作符/'(操作数的类型是 '__gnu_cxx :: __ normal_iterator>' 和 'INT')

+0

找相关的名称。 –

+0

说实话,如果你正在做回文检查,你需要使用'rbegin()'和'begin()'。 –

+0

通用回文检测器中魔术数字“6”的用途是什么? – Arun

回答

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 
+0

非常感谢,它工作完美。 – Newbie

0

使用typename

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