我必须声明Iter为typename,但没有typedef。
那么,我就不能在我的template class声明=>中使用=>了:
请教我如何使用Iter,否则解释为什么C++是如此的https://stackoverflow.com/questions/1085134/why-is-c-relatively-harder-to-use-bad-choice-for-a-beginner.
template <typename T>
struct MyContainer
{
typedef std::vector<T> Vec;
typename Vec::iterator Iter;
void Fo (typename std::vector<T>::iterator); //ok
typename std::vector<T>::iterator Ba(); //ok
void Foo (Iter); //error: 'Iter' is not a type
Iter Bar (); //error: 'Iter' does not name a type
}; //(gcc 4.1.2)typedef来声明Iter?为什么不行?Iter中使用template class?(例如函数参数类型)编辑
在指令typename Vec::iterator Iter;中,关键字typename表示Vec::iterator是一种类型(即不是静态成员函数/属性)。因此,Iter不是声明为类型,而是使用类型Vec::iterator声明为变量。
发布于 2012-10-19 08:02:49
typedef可以与typename一起使用。因此,它变成:
类型名称vec::iterator Iter;Iter吧。
模板结构MyContainer {ty胡枝子Foo::vector;typedef void Vec::iterator Iter;void ( Iter );//ok Iter Bar ();//ok };发布于 2012-10-19 08:13:01
只是为了补充之前的答案..。
typename Vec::iterator Iter;是一个有效的C++语句,它声明的不是类型,而是一个名为Iter的变量。
引入关键字typename是为了指定后面的标识符是类型。解析Vec::iterator时,编译器无法识别iterator意味着类型,因为它是依赖于模板的名称。它也可以是Vec中的静态数据成员。
发布于 2012-10-19 08:20:55
这一行:
typename Vec::iterator Iter; 声明一个名为Iter的成员变量,其类型为Vec::iterator (即vector<T>::iterator),而不是类型。
看看你在这之后做了什么,你的意思可能是:
typedef typename Vec::iterator Iter; https://stackoverflow.com/questions/12969854
复制相似问题