0

谁能解释为什么我不能像这样使用 C++ 模板:

template <typename T> class A {
public:
    typedef std::vector<T>::iterator myiterator;

    A(T value)
        :   v(10, value)
    {
    }

    myiterator begin()
    {
        return v.begin();
    }

    myiterator end()
    {
        return v.end();
    }

public:
    std::vector<T> v;
};

int main()
{
    A<int> a(10);

    for (auto i = a.begin(); i != a.end(); ++i)
        std::cout << *i << std::endl;

    return 0;
}

我在声明 myiterator 别名的行出现编译错误;错误是:“缺少';' 在标识符“myiterator”之前”。

4

3 回答 3

4

改变

typedef std::vector<T>::iterator myiterator;

typedef typename std::vector<T>::iterator myiterator;

由于您通过模板类型(向量)访问类型,因此您需要帮助编译器消除歧义。vector<T>::iterator可以是静态成员,也可以是类型。如果没有更多的 T 知识,编译器就无法确定。使用typename那里的关键字告诉编译器“将其视为一种类型”。

有关更多详细信息,请参阅在哪里以及为什么必须放置“模板”和“类型名称”关键字?

于 2013-10-10T14:42:42.523 回答
2

编译器应该知道std::vector是一种类型,它的依赖范围:

typedef typename std::vector<T>::iterator myiterator;
于 2013-10-10T14:43:15.210 回答
1

我收到有用的错误消息:

 'std::vector<T>::iterator' : dependent name is not a type
          prefix with 'typename' to indicate a type

你需要告诉它你正在声明一个类型:

typedef typename std::vector<T>::iterator myiterator;
//      ^^^^^^^^
于 2013-10-10T14:45:05.640 回答