使用C+时出现编译错误+;模板 谁能解释为什么我不能使用这样的C++模板:< /P> 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; } 模板类别A{ 公众: typedef std::vector::iterator myiterator; A(T值) :v(10,数值) { } 我的迭代器begin() { 返回v.begin(); } myiterator end() { 返回v.end(); } 公众: std::向量v; }; int main() { A(10); 对于(自动i=a.begin();i!=a.end();++i) 标准::cout

使用C+时出现编译错误+;模板 谁能解释为什么我不能使用这样的C++模板:< /P> 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; } 模板类别A{ 公众: typedef std::vector::iterator myiterator; A(T值) :v(10,数值) { } 我的迭代器begin() { 返回v.begin(); } myiterator end() { 返回v.end(); } 公众: std::向量v; }; int main() { A(10); 对于(自动i=a.begin();i!=a.end();++i) 标准::cout,c++,templates,compiler-errors,C++,Templates,Compiler Errors,变化 typedef std::vector<T>::iterator myiterator; typedef std::vector::iterator myiterator; 到 typedef typename std::vector::iterator myiterator; 由于您是通过模板类型(vector)访问类型,因此需要帮助编译器消除歧义。vector::iterator可以是静态成员,也可以是类型。如果不了解T,编译器无法确定。使用typename关键字告诉

变化

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

typedef typename std::vector::iterator myiterator;
由于您是通过模板类型(vector)访问类型,因此需要帮助编译器消除歧义。
vector::iterator
可以是静态成员,也可以是类型。如果不了解T,编译器无法确定。使用
typename
关键字告诉编译器“将其视为类型”


有关更多详细信息,请参见编译器应该知道
std::vector
是一种类型,它的依赖范围是:

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

我收到了有用的错误消息:

 'std::vector<T>::iterator' : dependent name is not a type
          prefix with 'typename' to indicate a type
“std::vector::iterator”:依赖名称不是类型
使用“typename”前缀表示类型
您需要告诉它您正在声明一个类型:

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

<代码>是的!但是这是为什么“TyPulf”还不够呢?为什么我要指定额外的Type名称关键字?C++是一个复杂的怪物,这就是为什么;)当你想要访问一个依赖于模板参数的类型时,你需要<代码> Type NeNe/COD>。
typedef typename std::vector<T>::iterator myiterator;
//      ^^^^^^^^