关于stl:无法创建模板< typename T>

Cannot create template<typename T> vector<T>::iterator in c++

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
7
8
9
10
11
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行创建as的迭代器。我必须为任何数据类型制作回文检查程序。语法是否有问题,或者我们不能这样做。谢谢!

错误信息如下:

"end"未在此范围中声明"start"未在此范围中声明依赖名称"std::vector::iterator"被分析为非类型,但实例化会生成一个类型依赖名称"std::vector::iterator"被分析为非类型,但实例化会生成一个类型"end"之前应输入";""start"之前应输入";""std::vector::iterator"之前需要"typename",因为"std::vector"是依赖范围"std::vector::iterator"之前需要"typename",因为"std::vector"是依赖范围"operator/"不匹配(操作数类型为"uu gnu_cxx::u normal_iterator>"和"int")。


使用typename

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


尝试以下操作

1
2
3
4
5
6
7
8
9
10
11
12
13
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;
}

这是一个测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#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;
}

输出为

1
2
3
true
false
true