2012-10-19 72 views
1

我必须声明Itertypename,但不是typedef
然后,我不能在我的templateclass声明中使用Iter =>沮丧:(
请告诉我如何使用Iter,否则解释我为什么C++是如此nasty ...模板类嵌套类型typename

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) 
  1. 为什么typedef不能用来声明Iter?为什么不呢?
  2. 如何内templateclass使用Iter?(例如,作为函数参数类型)

EDIT
在指令typename Vec::iterator Iter;关键字typenameVec::iterator是一种类型(即不是静态成员函数/属性)。因此,Iter未声明为类型,而是作为使用Vec::iterator类型的变量声明。

回答

7
  1. typedef可以和typename一起使用。因此,它变成了:

    typedef typename vec::iterator Iter; 
    
  2. 只需使用Iter现在。

    template <typename T> 
    struct MyContainer 
    { 
        typedef std::vector<T>   Vec; 
        typedef typename Vec::iterator Iter; 
    
        void Foo (Iter); //ok 
        Iter Bar();  //ok 
    }; 
    
+0

完美:)我刚才在你的答案代码源解决方案:-D感谢加;) – olibre

+1

@olibre关于您的编辑这个答案(我回滚了):可以在枚举中通过缩进两次使用blockquote(4 + 4 = 8个空格)。不需要任何不寻常的枚举语法... – jogojapan

+1

@jogojapan谢谢您的提示/建议:-D – olibre

1

只需添加到以前的答案...

typename Vec::iterator Iter; 

是一个有效的C++声明,声明不是一个类型,但一个名为Iter变量。

引入了关键字typename来指定后面的标识符是一个类型。解析Vec::iterator时,编译器无法识别iterator表示类型,因为它是取决于模板的名称。它可以是Vec中的静态数据成员。

Officially, what is typename for?

+0

是的,'typename'和'typedef'分别声明*变量名*和*变量类型*,不是吗? – olibre

+1

@olibre:你不太对。我为答案添加了一个解释。 – Andrey

+0

+1谢谢您的提示:'iterator'可能是属性或函数... – olibre

0

这条线:

typename Vec::iterator Iter; 

声明称为Iter一个成员变量,Vec::iterator类型(即vector<T>::iterator)的,而不是一种类型。

看着你在这之后,你可能是指做了什么:

typedef typename Vec::iterator Iter;